220. 存在重复元素 III(滑动窗口+有序集合)

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;// 有序集合,大小始终 <=k
        int 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;
    }
};

你可能感兴趣的:(LeetCode,算法,滑动窗口)