220. Contains Duplicate III

下标间距<=k,立马就想到滑动窗口,维护一个大小为k的区间。

对于新的数,维护区间大小的同时,需要判断该区间中是否存在 [num-t, num+t] 的数字。由于需要根据大小查找,可以利用大小为 k 的 set 作为维护的区间,set 是有序的,因此可以调用 lower_bound 找到第一个大于等于 num-t 的数字。只要判断该数是否小于等于 num+t 即可(因为只要有一个就行了)。

注意一下 int 会越界,要用 long(真恶心)。

class Solution {
public:
    bool containsNearbyAlmostDuplicate(vector<int>& nums, int k, int t) {
        set<long> s;
        for (int i=0;i<nums.size();++i){
            long num=nums[i];
            if (i>k) s.erase(nums[i-k-1]);
            auto low=s.lower_bound(num-t);
            if ( low!=s.end() && *low<=num+t ) return true;
            s.insert(num);
        }
        return false;
    }
};

猜你喜欢

转载自www.cnblogs.com/hankunyan/p/9159462.html