题目
给定一个整数数组,判断数组中是否有两个不同的索引
和
,使得
和
的差的绝对值最大为
,并且
和
之间的差的绝对值最大为
。
自己只想到了
,参考了官方的桶排解法,时间复杂度O(N)
class Solution {
public:
//注意考虑负数时处理,需要向下取整,保证每个桶大小都为m
long long getpos(long long &num,long long &m) {
return num<0 ? (num+1)/m-1 : num/m;
}
bool containsNearbyAlmostDuplicate(vector<int>& nums, int k, int t) {
if(t < 0) return false;
long long m = t+1LL;
unordered_map<long long,long long> mp;
int n = nums.size();
for(int i = 0;i < n;++i) {
long long num = nums[i];
long long p = getpos(num,m);
if(mp.find(p) != mp.end())
return true;
else if(mp.find(p-1) != mp.end() && abs(num-mp[p-1])<=t)
return true;
else if(mp.find(p+1) != mp.end() && abs(num-mp[p+1])<=t)
return true;
mp[p] = num;
if(i >= k) {
num = nums[i-k];
mp.erase(mp.find(getpos(num,m)));
}
}
return false;
}
};