1.題目:
在整數陣列 nums 中,是否存在兩個下標 i 和 j,使得 nums [i] 和 nums [j] 的差的絕對值小於等於 t ,且滿足 i 和 j 的差的絕對值也小於等於 ķ 。
如果存在則返回 true,不存在返回 false。
輸入: nums = [1,5,9,1,5,9], k = 2, t = 3
輸出: false
2.**:
分析:與(219)存在重複元素 ii不同在於在k視窗基礎上,將相等改為絕對值。
==> 雜湊表 + 桶排序:
"""
用雜湊表模擬桶,hash[num] = i ,即num 在第i桶內;
桶排序將不同的num放入不同的桶中:nbucket = num//(t+1),這樣在乙個桶中有t+1個數,絕對值只差最多為t
eg. bucket_0[num = 0,...,t],bucket_1[num = t+1,...,2t+1]
⇒ 如果兩個數在乙個桶內則兩個數絕對差值一定<=t,中;
相鄰桶差值最多為(2t+1 - 0)=2t+1,最小為(t+1 -t)=1 所以相鄰桶要算一下;
不相鄰桶元素絕對值差一定》t ,下一輪;
"""class
solution
:def
containsnearbyalmostduplicate
(self, nums: list[
int]
, k:
int, t:
int)
->
bool
:# bucket sort
if t<
0or k <0:
return
false
bucketdict =
for i,num in
enumerate
(nums)
: nbucket = num//
(t+1
)if nbucket in bucketdict:
return
true
if nbucket-
1in bucketdict:
ifabs
(num-bucketdict[nbucket-1]
)<=t:
return
true
if nbucket+
1in bucketdict:
ifabs
(num-bucketdict[nbucket+1]
)<=t:
return
true
bucketdict[nbucket]
= num
# 維護視窗
# [0,...,i-k,..., i,...]
# |k+1個數|
iflen
(bucketdict)
>k:
bucketdict.pop(nums[i-k]
//(t+1)
)return
false
leetcode 220 存在重複元素III
class solution if setsize k window.insert long nums end setsize end return false 快還是挺快的,記憶體消耗挺大。本質還是滑動視窗,視窗裡放k個數,然後第k 1個數找一下視窗裡有沒有和自己絕對值之差小於t的,有則查詢成功返...
220 存在重複元素 III
給定乙個整數陣列,判斷陣列中是否有兩個不同的索引 i 和 j,使得nums i 和nums j 的差的絕對值最大為 t,並且 i 和 j 之間的差的絕對值最大為 示例 1 輸入 nums 1,2,3,1 k 3,t 0輸出 true示例 2 輸入 nums 1,0,1,1 k 1,t 2輸出 tru...
220 存在重複元素 III
給定乙個整數陣列,判斷陣列中是否有兩個不同的索引 i ii 和 j jj,使得 num s i nums i nums i 和 num s j nums j nums j 的差的絕對值最大為 t tt,並且 i ii 和 j jj 之間的差的絕對值最大為 示例 1 輸入 nums 1 2,3 1 k...