题解:值和下标之差都在给定的范围内

题目描述
给你一个整数数组 nums 和两个整数 k 和 t 。请你判断是否存在 两个不同下标 i 和 j,使得 abs(nums[i] - nums[j]) <= t ,同时又满足 abs(i - j) <= k 。
如果存在则返回 true,不存在返回 false。
题目链接:【link

class Solution {
public:
    bool containsNearbyAlmostDuplicate(vector<int>& nums, int k, int t) {
        //暴力的解法:最后一个测试点会超时
        int len=nums.size();
        for(int i=0;i<len;i++){
            for(int j=i+1;j<=i+k&&j<len;j++){
                if(abs((long long)nums[i]-(long long)nums[j])<=(long long )t){
                    return true;
                }
            }
        }
        return false;
    }
};

官方题解:

int n = nums.size();
        set<int> rec;
        for (int i = 0; i < n; i++) {
        //防止溢出:INT_MIN,INT_MAX
            auto iter = rec.lower_bound(max(nums[i], INT_MIN + t) - t);//这里的lower_bound()是二分查找大于等于某元素的值
            if (iter != rec.end() && *iter <= min(nums[i], INT_MAX - t) + t) {
                return true;
            }
            rec.insert(nums[i]);
            if (i >= k) {
                rec.erase(nums[i - k]);
            }
        }
        return false;


把STL库运用到了极致(只能说自己对STL用法远远没有到很熟地步了233)


版权声明:本文为qq_45751990原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。