Problem: 220. 存在重复元素 III
文章目录
- 题目
- 思路
- Code
题目
给你一个整数数组 nums 和两个整数 indexDiff 和 valueDiff 。
找出满足下述条件的下标对 (i, j):
- i != j,
- abs(i - j) <= indexDiff
- abs(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(vector<int>& nums, int k, int t) {set<long 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;}
};