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.
有些复杂,网上很多解法其实都不正确,虽然AC了。最容易想到的滑动窗口,时间复杂度O(nk),估计会超时。二分查找的思想,可以用STL的set来实现,这样时间复杂度O(nlogk)。测试数据集很龌龊,要考虑溢出的情况。另外lower_bound和upper_bound这两个函数很容易让人迷惑。lower_bound返回大于等于target的第一个元素,upper_bound返回大于target的第一个元素。不是想象中的一个返回floor,一个返回ceiling。
class Solution {
public:
bool containsNearbyAlmostDuplicate(vector<int>& nums, int k, int t) {
set<long long> counts;
for (int i = 0; i < nums.size(); ++i) {
if (i > k) {
counts.erase(nums[i-k-1]);
}
auto iter = counts.lower_bound(nums[i]);
if (iter != counts.end()) {
// Check the bigger element
if (*iter - nums[i] <= t) {
return true;
}
// Check the smaller element
if (iter != counts.begin()) {
--iter;
if (nums[i] - *iter <= t) {
return true;
}
}
}
else if (counts.size() > 0) {
// All elements are smaller than current element
--iter;
if (nums[i] - *iter <= t) {
return true;
}
}
counts.emplace(nums[i]);
}
return false;
}
};