Contains Duplicate III -leetcode
2015-07-16 17:42
393 查看
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。
相关文章推荐
- 关于[[NSBundle mainBundle] pathForResource:@"name" ofType:@"type"]找不到指定文件的解决办法
- 增加samba用户提示Failed to add entry for user
- AIX系统中使用bsdlog函数输出内核信息
- 阻塞socket上read/write出现errno为EAGAIN的原因解密
- LeetCode#217 Contains Duplicate
- Achieving High Availability and Scalability - ARR and NLB
- 解决Xcode的MainStoryboard对齐不正确的问题
- Error : APP-FND-01926: The custom event WHEN-LOGON-CHANGED raised unhandled exception: ORA-06502: PL
- paint 画笔的一些属性
- aix etherchannel 切换方法和查看方式
- No assembly found containing an OwinStartupAttribute.
- List<T> Contains方法实现
- add constraint方法添加约束
- 实现flume tailfsource解决丢数等问题
- 给线程取名
- Command /usr/bin/codesign failed with exit code 1
- rails gem (2015-07-16)
- 内存管理(二):copy、retain、assign
- 编译so动态库出现relocation R_X86_64_32 against `a local symbol