220.存在重复元素 Ⅲ (lower_bound 以及 multiset重复元素的删除)

22
在这里插入图片描述

思路

这题意思就是在一段滑动串口里,对于任意一个数x,是否存在一个数 y 使得 abs(x - y) <= t ,即大小最接近y的数是否能满足条件。

很明显使用 lower_bound()函数来求,lower_bound()可以实现在一段排序的数列中,对于x,可以找出第一个>=x的数所在的位置,而set容器支持lower_bound()操作,multiset则可以实现滑动的有序排列,且支持插入和删除的操作,解法就显而易见;

需要注意的是,题目给值范围如果用int会越界;lower_bound时设置两个端点处哨兵;以及在multiset中删除元素时,需要删除的是下标i处的迭代器,而不是下标i处在容器中对应的值。

代码

class Solution {
public:
    bool containsNearbyAlmostDuplicate(vector<int>& nums, int k, int t) {
        typedef long long LL;
        multiset<LL>hash;
        hash.insert(1e18), hash.insert(-1e18); // 进行lower_bound时需要使用的边界
        for (int i = 0, j = 0; i < nums.size(); i++) {
            if (i - j > k) hash.erase(hash.find(nums[j++])); // 要删除迭代器,不然可能删除重复元素,可能有多个迭代器的值为相同值,这里只是删去其中任意一个不影响最终结果。
            LL x = nums[i]; 
            auto it = hash.lower_bound(x);
            if (abs (*it - x) <= t) return true;
            --it; // 找到比 x 小的第一个数
            if (abs (*it - x) <= t) return true;
            hash.insert(x);
        }
        return false;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值