Contains Duplicate III

  Given an array of integers, find out whether there are two distinct indices i and j in the array such that the difference between nums[i] and nums[j] is at most t and the difference between i and j is at most k.

  关于上述题意,我们可以转化为两个数学公式:

  存在|nums[i]-nums[j]|<=t且|i-j|<=k,为了计算方便,首先需要对前者进行变形。

  |nums[i]-nums[j]|<=t    ->       |nums[i]/t-nums[j]/t|<=1    ->       nums[j]/t - 1<= nums[i]/t <= nums[j]+1

则当nums[i]/t和nums[j]/t都同时取整,所以如果nums[i]/t能够满足上式,则取值只能为(nums[j]/t-1, nums[j], nums[j]+1)

  


 from collections import OrderedDict

 class Solution:
def containsNearbyAlmostDuplicate(self, nums, k, t):
orderedDic = OrderedDict() if k < 1 or t < 0:
return False for each in nums:
key = each/max(1, t) for m in (key-1, key, key+1):
if m in orderedDic and abs(orderedDic[m] - each) <= t:
return True orderedDic[key] = each if len(orderedDic) > k:
orderedDic.popitem(last=False) return False

  接下来,一行一行解释代码的意思。

  第1行,from collections import OrderedDict。这里主要是需要使用OrderedDict.OrderedDict与一般的Dict最大的区别在于,它是有序的。

  第8行,这里需要对没有意义的数据进行处理;

  第12行,根据上面的推理,我们字典的键值定义为each/max(1,t),这里为什么是max(1,t),而不直接是max(t),这里主要是考虑t=0的情况;

  第14-21行,对nums每个元素进行遍历,如果每一个元素m,将m/t作为键值,如果在orderedDic中,存在一个键值属于(m/t-1,m/t,m/t+1),则这就满足了上面推到的数学公式,但需要注意上面的数学公式并不是充要条件,所以需要判断abs(orderedDic[m] - each) <= t,当此时m/t不在orderedDic中,且orderedDic的长度<=k,则直接将此键值加入字典中,但是orderedDic的长度大于k,这时需要将最先加入的键值弹出,这也是使用orderedDic的原因。

  可能有些同志存在疑问,为什么当字典长度大于k时,需要将多余的键值弹出,而且还要弹出第一个存入的键值?

  |i-j|<=k这个条件就决定了,字典长度最大只能为k。假如,字典的长度为k+1,此时第k+2个元素与第一个元素满足|nums[0]-nums[k+1]|<=t条件,但它们不会满足|i-j|<=k,  因为|k+1-0|>=k。

最新文章

  1. CodeIgniter 开发,支付宝接口调用实例
  2. git操作日志
  3. SQL面试题
  4. 构建spring+mybatis+redis架构时遇到的小异常
  5. 【PRML读书笔记-Chapter1-Introduction】1.3 Model Selection
  6. combobox中动态加入几个checkbox,实现下拉框多选
  7. Android TabHost中Activity之间传递数据
  8. Android开发目录
  9. 跨域技术-jsonp
  10. c++:参数型别的推导
  11. Tempter of the Bone--hdu1010--zoj2110
  12. javascript模糊查询一个数组
  13. Azkaban3.x集群部署(multiple executor mode)
  14. content+animation实现loading效果
  15. poj2115(扩展欧基里德定理)
  16. tensorflow 的tf.where详解
  17. es基本查询相关的
  18. Go语言中Path包用法
  19. lnmp无法删除.user.ini文件的解决办法
  20. 如何处理HTML5新标签的兼容性问题

热门文章

  1. 【java设计模式】-04单例模式
  2. node.js由浅入深教程
  3. CentOs7:ssh远程登录错误WARNING:REMOTE HOST IDENTIFICATION HAS CHANGED解决简单办法
  4. JS广度优先查找无向无权图两点间最短路径
  5. LeetCode 32. 最长有效括号(Longest Valid Parentheses)
  6. legend3---12、DB::table(&#39;user_questions&#39;)和UserQuestion查询的结果的格式不一样
  7. legend3---11、php前端模块化开发
  8. kafka可视化工具安装及简单使用
  9. mysql 首次安装后 简单操作与语句 新手入门
  10. 2.1 Go语言基础之运算符