题目描述:
给你一个整数数组 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版权协议,转载请附上原文出处链接和本声明。