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] and nums[j] is at most t and the difference between i and j is at most k.
思路
基本思路是,假设当前运行到nums[i]的位置,则需要往前看k个数,并且找到其中任意一个数x满足 nums[i]-t <= x <=nums[i]+t。可以利用一个大小为k的二叉搜索树解决搜索范围的问题(问题就转变为:找到第一个>=nums[i]-t的数,判断他是否<=nums[i]+t)。整个算法的时间复杂度是O(N * logk),N为数组长度。
下面代码中用set实现,set是用红黑树实现的。
代码
class Solution {
public:
bool containsNearbyAlmostDuplicate(vector<int>& nums, int k, int t) {
if(nums.empty() || k<1 || t<0)
return false;
k++;
set<int> kNumSet;
for (int i=0; i<nums.size(); i++){
if(i >= k){
int oldVal = nums[i-k];
kNumSet.erase(oldVal);
}
auto l_bound = kNumSet.lower_bound(nums[i] - t);
if(l_bound != kNumSet.end()){
if(*l_bound - t <= nums[i])
return true;
}
kNumSet.insert(nums[i]);
}
return false;
}
};