220. 存在重复元素 III
给定一个整数数组,判断数组中是否有两个不同的索引 i 和 j,使得 nums [i] 和 nums [j] 的差的绝对值最大为 t,并且 i 和 j 之间的差的绝对值最大为 ķ。
示例 1:
输入: nums = [1,2,3,1], k = 3, t = 0
输出: true
示例 2:
输入: nums = [1,0,1,1], k = 1, t = 2
输出: true
示例 3:
输入: nums = [1,5,9,1,5,9], k = 2, t = 3
输出: false
解题
设置桶排序,将k个数字放入桶中;
(1)若两个数在一个桶中,返回true
(2)若隔壁桶的与当前入桶的数的差值小于等于t,返回true;
(3) 当i>k时,每次删除前面的桶中的元素;
class Solution {
public:
bool containsNearbyAlmostDuplicate(vector<int>& nums, int k, int t) {
//桶排序
if(t<0) return false;
int n=nums.size();
long long MAX=INT_MIN;
long long MIN=INT_MAX;
for(int i:nums) {
MAX=max((int)MAX,i);
MIN=min((int)MIN,i);
}
for(int i=0;i<n;i++)
{
long long tmp=((long long)nums[i]-MIN)/((long long)t+1);
if(bucket.count(tmp)) return true;
if(bucket.count(tmp-1)&&(abs((long long)nums[i]-(long long)nums[bucket[tmp-1]])<=(long long)t)) return true;
if(bucket.count(tmp+1)&&(abs((long long)nums[i]-(long long)nums[bucket[tmp+1]])<=(long long)t)) return true;
bucket[tmp]=i;
if(i>=k) {
long long tmp=((long long)nums[i-k]-MIN)/((long long)t+1);
bucket.erase(tmp);
}
}
return false;
}
private:
unordered_map<long long,int> bucket;
};
该博客讨论了如何运用桶排序算法解决一道编程题——存在重复元素III。题目要求找出数组中两个不同索引,使得它们对应元素差的绝对值最大不超过t,且索引差的绝对值不超过k。博主提出了通过桶排序的方法,检查相邻桶中元素差值是否满足条件来判断解的存在性。
348

被折叠的 条评论
为什么被折叠?



