高端网站设计百家号,遵义网上商城,淮南seo,wordpress qqoqProblem: 220. 存在重复元素 III 文章目录 题目思路Code 题目
给你一个整数数组 nums 和两个整数 indexDiff 和 valueDiff 。
找出满足下述条件的下标对 (i, j)#xff1a;
i ! j,abs(i - j) indexDiffabs(nums[i] - nums[j]) valueDiff 如果存在#xff0c;返回… Problem: 220. 存在重复元素 III 文章目录 题目思路Code 题目
给你一个整数数组 nums 和两个整数 indexDiff 和 valueDiff 。
找出满足下述条件的下标对 (i, j)
i ! j,abs(i - j) indexDiffabs(nums[i] - nums[j]) valueDiff 如果存在返回 true 否则返回 false 。
思路 滑动窗口 暴力搜索的话就是两层循环枚举(i,j)找到符合条件的即可但是会超时 O ( n 2 ) O(n^{2}) O(n2)。
用滑动窗口来优化我们维护一个长度始终小于等于t的有序集合。 窗口收缩时机 当right -left indexDiff ,收缩左端点left。 题目中要求窗口内的 abs(nums[i] - nums[j]) valueDiff, 我们使用一个 Set来维护窗口内的值存在|nums[i] - nums[j]| valueDiff 就返回true,
Code
class Solution {
public:bool containsNearbyAlmostDuplicate(vectorint nums, int k, int t) {setlong long st;// 有序集合大小始终 kint left 0;for (int right 0; right nums.size(); right ) {if (right - left k) {st.erase(nums[left]);left ;}auto iter st.lower_bound((long long) nums[right] - t);if (iter ! st.end()) {if(abs(*iter - nums[right]) t)return true;}st.insert(nums[right]);}return false;}
};