Contains Duplicate III (Leetcode 220)

参考: http://www.cnblogs.com/grandyang/p/4545261.html

双指针,或者用map lower bound找。lower bound找到的是比k大中(>= k),最小的数。

bool containsNearbyAlmostDuplicate(vector<int>& nums, int k, int t) {
        if(nums.empty()) return false;
        map<int, int> mp;
        int start = 0;
        for(int i=0; i<nums.size(); i++){
            if(i-start > k){
                mp.erase(nums[start++]);
            }
            auto it = mp.lower_bound(nums[i]-t);
            if(it != mp.end()){
                if(abs(nums[i] - it->first) <= t) return true;
            }
            mp[nums[i]] = i;
        }
        return false;
    }

第二种是不用lower bound的双指针扫描

bool containsNearbyAlmostDuplicate(vector<int>& nums, int k, int t) {
        if(nums.empty()) return false;
        int left = 0;
        for(int i=1; i<nums.size(); i++){
            if(labs(nums[i]-nums[left]) <= t && i-left <= k) return true;
            if(i-left >= k){
                for(int j=left+1; j<i; j++){
                    if(labs(nums[i]-nums[j]) <= t && i-j <= k) return true;
                }
                left = i-k+1;
            }
        }
        return false;
    }

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容