Contains Duplicate III (Leetcode

2016-11-25  本文已影响0人  stepsma

参考: 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;
    }

上一篇下一篇

猜你喜欢

热点阅读