220.leetcode Contains Duplicate III (medium)[]

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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值