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], nums[j]绝对值在t 以内且索引相减绝对值在k之间
给定一个整型数组找出是否存在两个索引,使得nums[i], nums[j]绝对值在t 以内且索引相减绝对值在k之间
。
思路:使用带有顺序的查找结构
//LEETCODE_220_CONTAINS_DUPLICATE_III_H
#include <iostream>
#include <vector>
#include <set>
using namespace std;
class Solution {
public:
//时间复杂度 O(nlogn)
//空间复杂度 O(k)
//思路:使用具有顺序性的查找
bool containsNearbyAlmostDuplicate(vector<int>& nums, int k, int t) {
set<long long> ans;
for (int i=0; i<nums.size(); ++i){
if (ans.lower_bound((long long)nums[i]-(long long )t)!=ans.end() &&
*ans.lower_bound((long long) nums[i]-(long long)t)<= (long long)nums[i]+(long long)t){
return true;
}
ans.insert((long long)nums[i]);
if (ans.size()==k+1){
ans.erase(nums[i-k]);
}
}
return false;
}
};
class Test{
public:
void test(){
vector<int> a={-1, -1};
int k=1;
int t=0;//exp: true
cout<<boolalpha<<Solution().containsNearbyAlmostDuplicate(a, k, t)<<endl;
}
};