220. Contains Duplicate III 数组指针差k数值差t
[抄题]:
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.
Example 1:
Input: nums = [1,2,3,1], k = 3, t = 0
Output: true
Example 2:
Input: nums = [1,0,1,1], k = 1, t = 2
Output: true
Example 3:
Input: nums = [1,5,9,1,5,9], k = 2, t = 3
Output: false
[暴力解法]:
时间分析:
空间分析:
[优化后]:
时间分析:
空间分析:
[奇葩输出条件]:
[奇葩corner case]:
bucket值可能很小,所以用 让分子变大。
- Integer.MIN_VALUE
[思维问题]:
以为2个指针,没想到果然有技巧
[英文数据结构或算法,为什么不用别的数据结构或算法]:
水桶排序的精髓在于容量恒定,重复出现的放在下一个水桶。此题要求数字差值恒定,所以可以用水桶排序。
做法:/容量即可。类似取余数。
[一句话思路]:
差值不超过t, 而且越近越好。在k范围内的bucket值重复出现肯定可以,相邻的检查一下也可以。
[输入量]:空: 正常情况:特大:特小:程序里处理到的特殊情况:异常情况(不合法不合理的输入):
[画图]:

[一刷]:
- map里存的是对象,变量类型都是大写开头。只能用put方法。其他一般的变量类型用小写开头即可。
long remappedNum = (long) nums[i] - Integer.MIN_VALUE;每个变量都要改成long- 求map整个一坨的方法是:
if (map.keySet().size() > k)
[二刷]:
long型放在分母时,要加括号
/ ((long)t + 1);
[三刷]:
[四刷]:
[五刷]:
[五分钟肉眼debug的结果]:
nums[i - k] 要不要-1 自己试试就行了,也是debug的一个重点
[总结]:
水桶排序要求不能重复。做法:/容量即可。类似取余数。
[复杂度]:Time complexity: O(n) Space complexity: O(n)
[算法思想:迭代/递归/分治/贪心]:
[关键模板化代码]:
[其他解法]:
[Follow Up]:
[LC给出的题目变变变]:
[代码风格] :
[是否头一次写此类driver funcion的代码] :
[潜台词] :
class Solution {
public boolean containsNearbyAlmostDuplicate(int[] nums, int k, int t) {
//cc
if (nums == null || nums.length == 0) return false;
if (k < 1 || t < 0) return false;
//ini: HashMap, bucket
HashMap<Long, Long> map = new HashMap<>();
//for loop: judge as true in 3 cases, add(bucket, value) to map while maintain k
for (int i = 0; i < nums.length; i++) {
long appendedNum = (long)nums[i] - Integer.MIN_VALUE;
long bucket = appendedNum / ((long)t + 1);
//judge as true in 3 cases
if (map.containsKey(bucket) ||
(map.containsKey(bucket - 1) && Math.abs(appendedNum - map.get(bucket - 1)) <= t) ||
(map.containsKey(bucket + 1) && Math.abs(map.get(bucket + 1) - appendedNum) <= t)) return true;
//while maintain k numbers in the map
if (map.entrySet().size() >= k) {
long lastBucket = ((long)nums[i - k] - Integer.MIN_VALUE) / ((long)t + 1);
map.remove(lastBucket);
}
//put to map
map.put(bucket, appendedNum);
}
return false;
}
}
220. Contains Duplicate III 数组指针差k数值差t的更多相关文章
- [LeetCode]Median of Two Sorted Arrays 二分查找两个有序数组的第k数(中位数)
二分.情况讨论 因为数组有序,所以能够考虑用二分.通过二分剔除掉肯定不是第k位数的区间.如果数组A和B当前处理的下标各自是mid1和mid2.则 1.假设A[mid1]<B[mid2], ①.若 ...
- 【medium】220. Contains Duplicate III
因为要考虑超时问题,所以虽然简单的for循环也可以做,但是要用map等内部红黑树实现的容器. Given an array of integers, find out whether there ar ...
- 220. Contains Duplicate III
题目: Given an array of integers, find out whether there are two distinct indices i and j in the array ...
- [Leetcode] 220. Contains Duplicate III
Given an array of integers, find out whether there are two distinct indices i and j in the array suc ...
- 220 Contains Duplicate III 存在重复 III
给定一个整数数组,判断数组中是否有两个不同的索引 i 和 j,使 nums [i] 和 nums [j] 的绝对差值最大为 t,并且 i 和 j 之间的绝对差值最大为 k. 详见:https://le ...
- LeetCode 220. Contains Duplicate III (分桶法)
Given an array of integers, find out whether there are two distinct indices i and j in the array suc ...
- [LeetCode] 220. Contains Duplicate III 包含重复元素 III
Given an array of integers, find out whether there are two distinct indices i and j in the array suc ...
- [刷题] 220 Contains Duplicate III
要求 给出整型数组nums和整数k,是否存在索引i和j 使得nums[i]和nums[j]之差不超过t,且i和j之差不超过k 思路 建立k个元素的有序查找表 每次有新元素加入,寻找查找表中大于 num ...
- (medium)LeetCode 220.Contains Duplicate III
Given an array of integers, find out whether there are two distinct indices i and j in the array suc ...
随机推荐
- linux安装redis标准流程-按这个来
1.将下载好的压缩包放到/usr/local目录下# tar xzf redis-3.2.9.tar.gz # cd redis-3.2.9 # make 提示错误 make: cc: Command ...
- MySQL Point in Time Recovery the Right Way
In this blog, I’ll look at how to do MySQL point in time recovery (PITR) correctly. Sometimes we nee ...
- springboot中添加热部署
<dependency> <!--Spring 官方提供的热部署插件 --> <groupId>org.springframework.boot</group ...
- 格式化输出=========》format 和 %
str.format() 实现格式化输出的功能 s1 = "i am {0},gae{1}".format("alex",18) 普通版,直接输入元祖 ...
- c# 多态 虚方法
多态: 为了解决同一种指令,可以有不同行为和结果 在运行时,可以通过调用同一个方法,来实现派生类中不同表现. 虚方法——抽象类——抽象函数——接口 虚方法: 被virtual 关键字修饰的方法 叫做 ...
- html/css/js-个人容易忘的一些属性
1.当div里面的文字超过给定div给定的宽度,div里面的文字自动换行 word-break:break-all:会截断该行最后的单词 word-wrap:break-word:不会截断,该行长度最 ...
- Redis 服务端配置——Could not connect to Redis at 127.0.0.1:6379: Connection refused
[root@centoszang 桌面]# redis-cli Could : Connection refused Could : Connection refused not connected& ...
- 【亲测显式等待】Selenium:元素等待的4种方法
Selenium:元素等待的4种方法 1.使用Thread.sleep(),这是最笨的方法,但有时候也能用到而且很实用. 2.隐式等待,隐性等待是指当要查找元素,而这个元素没有马上出现时,告诉We ...
- java 解耦
探索目的:使用的时候,只需要一次调用就可以完成日常复杂的操作.而工具类的高耦合带来业务代码维护复杂度加大.以 java 的思想对原始工具加以改进. 有没有比这里尝试的方法更高明的,在 A_Utils. ...
- 到底什么是哈希Hash?
知识点总结 ---------------------------------------------------------------------------------------------- ...