变量简洁正确完整思路
滑动窗口leftright,长度k,对于新的元素num1可以遍历窗口内部,如果滑动窗口用set或map存放就有序,调用lower_bound(num1-t)找到第一个大于等于num1-t的迭代器it,找到且*it<=num1+t则true,否则num1放进串口right++

精确定义
left已经
right已经
window  set,大小right-left+1,小于等于k

class Solution {
public:
    bool containsNearbyAlmostDuplicate(vector<int>& nums, int k, int t) {
        set<int>window;
        int left=0,right=-1,n=nums.size();
        while(1){
            if(right-left+1<=k&&right<=n-2){
                right++;
                auto it=window.lower_bound(max(nums[right],INT_MIN+t)-t);
                if(it!=window.end()&&*it<=min(nums[right],INT_MAX-t)+t)return true;
                window.insert(nums[right]);
            }else if(right-left+1>k){
                window.erase(nums[left]);
                left++;
                if(right==n-1)break;
            }else break;
        }
        return false;
    }
};

踩过的坑
(max(nums[right],INT_MIN+t)-t);防止nums[right]-t超出的方式是nums[right]
大于INT_MIN+t
   set<int>window;有序集合
auto it=window.lower_bound  stl容器调用lower_bound二分查找找到第一个大于等于num的迭代器
滑动窗口通常用原数组保存,这道题用set保存为了有序

 

posted on 2021-08-08 19:12  offer快到碗里来~  阅读(29)  评论(0)    收藏  举报