日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【桶】220.存在重复元素 III 【LeetCode】

發(fā)布時間:2023/12/1 编程问答 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【桶】220.存在重复元素 III 【LeetCode】 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

220.存在重復(fù)元素 III 【LeetCode】

給你一個整數(shù)數(shù)組 nums 和兩個整數(shù) k 和 t。請你判斷是否存在 兩個不同下標(biāo)i和j,使得 abs(nums[i] - nums[j]) <= t,同時又滿足 abs(i - j) <= k。

如果存在則返回 true,不存在返回 false。

示例 1
輸入:nums = [1,2,3,1], k = 3, t = 0
輸出:true

示例 2
輸入:nums = [1,0,1,1], k = 1, t = 2
輸出:true

示例 3
輸入:nums = [1,5,9,1,5,9], k = 2, t = 3
輸出:false

提示
0<=nums.length<=2?1040 <= nums.length <= 2 * 10^40<=nums.length<=2?104
?231<=nums[i]<=231?1-2^{31} <= nums[i] <= 2^{31} - 1?231<=nums[i]<=231?1
0<=k<=1040 <= k <= 10^40<=k<=104
0<=t<=231?10 <= t <= 2^{31} - 10<=t<=231?1

思路:由于對于一個數(shù) xxx,只要找到存在[x?t,x+t][x-t,x+t][x?t,x+t]內(nèi)的數(shù)就算成功,于是采用桶的思想,桶的大小設(shè)為 t+1t+1t+1,此時桶內(nèi)的極差為 ttt,即桶內(nèi)的任意的兩個數(shù)的差都符合條件,因此若某個桶同時出現(xiàn)兩個及以上的元素即說明 truetruetrue,而對于數(shù) xxx 既可向前找 ttt 個數(shù),也可向后找 ttt 個數(shù),因此還需觀察相鄰?fù)爸械脑?#xff0c;相鄰?fù)叭舸嬖谂c該數(shù)的差值不大于 ttttruetruetrue,而由于某桶中出現(xiàn)兩個元素就直接成功了,因此相鄰?fù)耙礇]有元素,要么只有一個元素(因此采用哈希表實現(xiàn)桶),因此只需比對常數(shù)級次數(shù)。而對于限制條件 kkk,只需模擬大小 k+1k+1k+1 的滑動窗口,從左到右遍歷數(shù)組,每次從右端加入新的數(shù)并且刪除最左端的數(shù)

官方題解

class Solution { public:int getID(int x, long w) {return x < 0 ? (x + 1ll) / w - 1 : x / w;}bool containsNearbyAlmostDuplicate(vector<int>& nums, int k, int t) {unordered_map<int, int> mp;int n = nums.size();for (int i = 0; i < n; i++) {long x = nums[i];int id = getID(x, t + 1ll);if (mp.count(id)) {return true;}if (mp.count(id - 1) && abs(x - mp[id - 1]) <= t) {return true;}if (mp.count(id + 1) && abs(x - mp[id + 1]) <= t) {return true;}mp[id] = x;if (i >= k) {mp.erase(getID(nums[i - k], t + 1ll));}}return false;} };作者:LeetCode-Solution 鏈接:https://leetcode-cn.com/problems/contains-duplicate-iii/solution/cun-zai-zhong-fu-yuan-su-iii-by-leetcode-bbkt/ 來源:力扣(LeetCode) 著作權(quán)歸作者所有。商業(yè)轉(zhuǎn)載請聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請注明出處。

代碼解釋

哈希映射函數(shù)

int getID(int x, long w) {return x < 0 ? (x + 1ll) / w - 1 : x / w; }


正數(shù)部分很好理解,主要討論負(fù)數(shù)部分

  • 首先將負(fù)數(shù)都加1,由圖可以看到加1后負(fù)數(shù)的坐標(biāo)恰好與右邊正數(shù)形成鏡像映射,于是對稱的兩邊的 ididid 互為相反數(shù)
  • 為解決 +0+0+0?0-0?0ididid 沖突,于是將負(fù)數(shù)桶的 ididid 均減1
  • 總結(jié)

    以上是生活随笔為你收集整理的【桶】220.存在重复元素 III 【LeetCode】的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。