220. 存在重复元素III

220. 存在重复元素 III

难度:中等

在整数数组 nums 中,是否存在两个下标 ij,使得 nums [i]nums [j] 的差的绝对值小于等于 t ,且满足 ij 的差的绝对值也小于等于 ķ

如果存在则返回 true,不存在返回 false

示例 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

提示:

  • 0 <= nums.length <= 2 * 10^4
  • -2^31 <= nums[i] <= 2^31 - 1
  • 0 <= k <= 10^4
  • 0 <= t <= 2^31 - 1

解答:

class Solution {
    //二叉搜索树
    //时间复杂度O(nlog(min(n,k)))。空间复杂度O(min(n,k))
    public boolean containsNearbyAlmostDuplicate(int[] nums, int k, int t) {
        TreeSet<Long> set = new TreeSet<>();
        for(int i = 0; i < nums.length; i++){
            Long num = new Long(nums[i]);
            
            Long s = set.ceiling(num);
            if(s != null && s - nums[i] <= t) return true;

            Long g = set.floor(num);
            if(g != null && nums[i] - g <= t) return true;
            
            set.add(num);
            if(set.size() > k){
                set.remove(new Long(nums[i - k]));
            }
        }
        return false;
    }
}

class Solution {
    //桶排序
    //时间复杂度O(n)。空间复杂度O(min(n,k))
    // Get the ID of the bucket from element value x and bucket width w
    // In Java, `-3 / 5 = 0` and but we need `-3 / 5 = -1`.
    private long getID(long x, long w) {
        return x < 0 ? (x + 1) / w - 1 : x / w;
    }

    public boolean containsNearbyAlmostDuplicate(int[] nums, int k, int t) {
        if (t < 0) return false;
        Map<Long, Long> d = new HashMap<>();
        long w = (long)t + 1;
        for (int i = 0; i < nums.length; ++i) {
            long m = getID(nums[i], w);
            // check if bucket m is empty, each bucket may contain at most one element
            if (d.containsKey(m))
                return true;
            // check the nei***or buckets for almost duplicate
            if (d.containsKey(m - 1) && Math.abs(nums[i] - d.get(m - 1)) < w)
                return true;
            if (d.containsKey(m + 1) && Math.abs(nums[i] - d.get(m + 1)) < w)
                return true;
            // now bucket m is empty and no almost duplicate in nei***or buckets
            d.put(m, (long)nums[i]);
            if (i >= k) d.remove(getID(nums[i - k], w));
        }
        return false;
    }
}

参考自:

作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/contains-duplicate-iii/solution/cun-zai-zhong-fu-yuan-su-iii-by-leetcode/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

上一篇:AtCoder Beginner Contest 220


下一篇:AtCoder Beginner Contest 220