220.存在重复元素 III
就着把三题关联的给做了
描述
给定一个整数数组,判断数组中是否有两个不同的索引 i 和 j,使得 nums [i] 和 nums [j]的差的绝对值最大为 t,并且 i 和 j 之间的差的绝对值最大为 ķ。
示例
输入: nums = [1,2,3,1], k = 3, t = 0
输出: true
输入: nums = [1,0,1,1], k = 1, t = 2
输出: true
输入: nums = [1,5,9,1,5,9], k = 2, t = 3
输出: false
我
class Solution:
def containsNearbyAlmostDuplicate(self, nums, k, t):
"""
:type nums: List[int]
:type k: int
:type t: int
:rtype: bool
"""
if len(nums) == 0 or t < 0:
return False
d = {nums[0]: 0}
for i in range(1, len(nums)):
if nums[i] in d:
if abs(i-d[nums[i]]) <= k:
return True
else:
d[nums[i]] = i
continue
l = sorted(d.keys())[::-1]
j = 0
while j < len(l):
if abs(nums[i] - l[j]) <= t:
if -k <= i - d[l[j]] <= k:
return True
j+=1
d[nums[i]] = i
return False
疯狂改代码,最后还是超出时间限制,看看别人的
思路:因为没有重复,所以不能用hash。坐标之差在一个范围内,我们可以每次只在这个范围内寻找数,比如:从左往右移动,当长度大于k,那么就把搜索区间的最左边删除;
lenth = len(nums)
a = set()
for i in range(lenth):
if t==0:
if nums[i] in a:
return True
else:
for atem in a:
if abs(nums[i]-atem)<=t:
return True
a.add(nums[i])
if len(a) == k+1:
a.remove(nums[i-k])
return False