220.leetcode Contains Duplicate III (medium)[]

来源:互联网 发布:通用顶级域名有 编辑:程序博客网 时间:2024/05/07 10:04

Given an array of integers, find out whether there are two distinct indices i and j in the array such that the difference between nums[i] andnums[j] is at most t and the difference between i and j is at most k.

在Contains Duplicate II上进行了改进,要求nums[i]与nums[j]的差值最大为t,维护一个二叉搜索树,用multiset[红黑树],二叉搜索树种存放的是k个相邻滑动窗口的内容

class Solution {public:    bool containsNearbyAlmostDuplicate(vector<int>& nums, int k, int t) {        int n = nums.size();        if(n<=1) return false;        /*int i=0,len = k;        len = len<n?(n-1-len):(n-2);        int step = k<n?k:(n-1);        cout<<i<<" "<<len<<endl;        while(i<=len)        {            cout<<i<<"feuri"<<len<<endl;           for(int u = i+1;u<=i+step;u++)           {               cout<<nums[i]<< " fgk"<<nums[u]<<endl;               if(abs(nums[i]-nums[u])<=t)                    return true;           }           i++;        }*/        //维护一个二叉搜索树,用multiset[红黑树],二叉搜索树种存放的是k个相邻滑动窗口的内容        multiset<long long> tree;        for(int i=0;i<n;i++)        {            if(tree.size()>=k+1) tree.erase(tree.find(nums[i-k-1]));            multiset<long long>::iterator iter = tree.lower_bound(nums[i]);            if(iter != tree.end() && abs(*iter-nums[i]) <= t) return true;            multiset<long long>::iterator iter1 = tree.upper_bound(nums[i]);            cout<<nums[i]<<" "<<*iter1<<endl;            if(iter1 != tree.begin() && abs(nums[i] - *(--iter1)) <= t) return true;            tree.insert(nums[i]);        }        return false;    } };


0 0
原创粉丝点击