leetcode 220 存在重複元素 III

2021-10-10 00:27:01 字數 1559 閱讀 9265

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...