class Solution {
// 木桶原理
public:
bool containsNearbyAlmostDuplicate(vector<int>& nums, int k, int t) {
if ( k < 1 || t < 0 )
return false;
const long long startPos = 0x80000000; // 数据重映射
unordered_map<long long, int> _map;
for (int i = 0; i < nums.size(); ++i){
long long newNum = (long long)nums[i] - startPos; // nums[i]前加long long,避免溢出
auto iter = _map.find(newNum / (t + 1));
if (iter != _map.end() && i - iter->second <= k)
return true;
iter = _map.find(newNum / (t + 1) + 1);
if (iter != _map.end() && i - iter->second <= k){
if ( abs((long long)nums[iter->second] - nums[i]) <= (long long)t)
return true;
}
iter = _map.find(newNum / (t + 1) - 1);
if (iter != _map.end() && i - iter->second <= k){
if ( abs ((long long)nums[i] - nums[iter->second]) <= (long long)t)
return true;
}
_map[newNum / (t + 1)] = i; // 将一组相邻的数值映射到一个数值, 重点
//这样写错误,若newNum/(t+1)已经存在,则无法更新i值
// _map.insert(make_pair(newNum / (t + 1), i));
}
return false;
}
};
注意点:
1. 注意溢出问题