存在重复元素 III(桶排)

题目
给定一个整数数组,判断数组中是否有两个不同的索引 i i j j ,使得 n u m s [ i ] nums [i] n u m s [ j ] nums[j] 的差的绝对值最大为 t t ,并且 i i j j 之间的差的绝对值最大为 ķ ķ
自己只想到了 s e t + l o w e r _ b o u n d set+lower\_bound ,参考了官方的桶排解法,时间复杂度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;
    }
};
发布了152 篇原创文章 · 获赞 2 · 访问量 6438

猜你喜欢

转载自blog.csdn.net/weixin_43918473/article/details/105458211