220. Contains Duplicate III

Given an array of integers, find out whether there are two distinct indices i and j in the array such that the absolute difference between nums[i] and nums[j] is at most t and the absolute difference between i and j is at most k.

Solution:Bucket

思路:
Bucket:
t = 3
nums = 3 4 5 6 7 8 9 10
"remaped / t" = 1 1 1 2 2 2 3 3

将nums中的元素归一化(主要是除以t) 后按归一化后的值存在桶里,同一个桶内的数组数值范围肯定是t;
基本思路,就是说每来一个元素,来一个桶("范围内t的")装着它,直到装到k个元素(保证要找的两个元素的index difference是<=k个的)。如果没有满足t条件时,每个桶中一个元素。
此时下一个元素如果是这些桶里的,或者是隔壁桶里满足 && map.get(bucket +- 1) - remappedNum <= t的,则return True; 若不是这个桶里的,则更新:来一个新桶("范围内t的")装着它,并删除nums[i - k]对应的桶来保证要找的两个元素的index difference是<=k个的,也就是只有k个桶。
Time Complexity: O(N) Space Complexity: O(N)

Solution Code:

 class Solution {
    public boolean containsNearbyAlmostDuplicate(int[] nums, int k, int t) {
        if (k < 1 || t < 0) return false;
        Map<Long, Long> map = new HashMap<>(); // bucket_num -> remappedNum
        
        for (int i = 0; i < nums.length; i++) {
            long remappedNum = (long) nums[i] - Integer.MIN_VALUE;
            long bucket = remappedNum / ((long) t + 1); // + 1 to avoid zero
            if (map.containsKey(bucket)
                || (map.containsKey(bucket - 1) && remappedNum - map.get(bucket - 1) <= t)
                || (map.containsKey(bucket + 1) && map.get(bucket + 1) - remappedNum <= t))
                return true;
            if (map.entrySet().size() >= k) {
                long lastBucket = ((long) nums[i - k] - Integer.MIN_VALUE) / ((long) t + 1);
                map.remove(lastBucket);
            }
            map.put(bucket, remappedNum);
        }
        return false;
    }
}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 背景 一年多以前我在知乎上答了有关LeetCode的问题, 分享了一些自己做题目的经验。 张土汪:刷leetcod...
    土汪阅读 14,351评论 0 33
  • 有一天我仰望天空,什么都没有。 也就不存在,所谓的白与黑。 有一天我远望你,什么念头,都未生起。 你不懂天。 我不懂你。
    吕风风快回家阅读 1,638评论 0 2
  • 现在社会,很多女性,说到离婚,谈虎色变。好像女人没有了婚姻就像天塌了一样,没法生活。 还有,如果朋友们说到某某个熟...
    微语素心阅读 4,935评论 9 9
  • 那天天空灰白阴沉 我绕着林间 走了一遍又一遍 在安静的树林 周遭是层层绿涛 残荷只剩空空的躯干 鸟啼声声在远处缭绕...
    小柏木阅读 663评论 0 1
  • 从年初一到今天一直没动静的群因为元宵的到来,提前热闹了一把。群里抢红包抢得火热,一直在等系统更新,于是加入进去,最...
    昵称毫无意义阅读 5,714评论 0 0