利用查找表的顺序性

c++实现了lower_bound,即一个数的ceil操作,可以用来实现一个范围的查找问题,需要注意的是lower_bound(v),返回会的是查找数v的ceil的迭代器(指针),返回的这个ceil的值就是set中大于v的最小的那个数。

void example(){
    int v = 0;
    set<int> record; // 一个set
    // 在set中查找大于v的最小的值有没有
    set<int>::iterator it = record.lower_bound(v);
    // it不等于 record.end()所以查找到了
    if (it != record.end())
        cout << *it << endl;
    // 可以对 查找到的这个值 *it做其他的一些操作
}

利用lower_bound可以完成的例题如下:

220. Contains Duplicate III

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

给定一个数组nums,查找是否存在这样的两个数他们的:

  • 位置i和j之差不超过k;
  • nums[i]与nums[j]不超过t,即是
    |nums[i]nums[j]|<=t

    其中,nums[i]是当前考察的元素(我们设其为v),numm[j]是已经放到set中的元素(我们设其为x),t是输入给定的,如果t<0肯定是无解的,因此输入需要满足t>=0,也就是要满足,
    |vx|<=t

    也就是看这个成立不,
    vt<x<=v+t

因此,我们看set存不存在x,也就要判断如下式子成立不:

lower_bound(vt)<=v+t

代码:

class Solution {
public:
    bool containsNearbyAlmostDuplicate(vector<int>& nums, int k, int t) {

        set<long long> record;
        for (int i = 0; i < nums.size(); i++){
            if (record.lower_bound((long long)nums[i] - (long long)t) != record.end() &&
                *record.lower_bound((long long)nums[i] - (long long)t) <= (long long)nums[i] + (long long)t){
                return true;
            }
            record.insert(nums[i]);
            if (record.size() == k + 1){
                record.erase(nums[i - k]);
            }
        }
        return false;
    }
};

上述使用long long 类型是为了解决整型溢出问题。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值