【桶】220.存在重复元素 III 【LeetCode】
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ù)的差值不大于 ttt 則 truetruetrue,而由于某桶中出現(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ù)部分
總結(jié)
以上是生活随笔為你收集整理的【桶】220.存在重复元素 III 【LeetCode】的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 苹果iPhone手机怎么投屏到电视,三种
- 下一篇: 【莫队】区间众数(Codeforces