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 difference between nums[i] and nums[j] is at most t and the difference between i and j is at most k.
链接: http://leetcode.com/problems/contains-duplicate-iii/
题解:
一开始的想法是用类似Contains Duplicate II的方法,不过好像不好写。于是研究了一下Discuss,发现有大概三种解法。
- Sort the array, keep original index
- TreeMap
- Bucket sliding window.
最后暂时只做了第一种方法。排序以后再查找,这里需要自己定义一个数据结构,implements Comparable,并且还有一个inRangeTWith method来比较两个节点的原index是否在t范围内。 二刷一定要补上第二和第三种。
Time Complexity - O(n2) , Space Complexity - O(n)
public class Solution {
public boolean containsNearbyAlmostDuplicate(int[] nums, int k, int t) {
if(nums == null || nums.length < 2 || t < 0 || k < 0)
return false; ValueWithIndex[] arr = new ValueWithIndex[nums.length];
for(int i = 0; i < nums.length; i++)
arr[i] = new ValueWithIndex(nums[i], i); Arrays.sort(arr); for(int i = 0; i < arr.length; i++) {
for(int j = i + 1; (j < arr.length) && (arr[j].inRangeTWith(arr[i], t)); j++) {
if(Math.abs(arr[i].index - arr[j].index) <= k)
return true;
}
}
return false;
} private class ValueWithIndex implements Comparable<ValueWithIndex> {
public int value;
public int index; public ValueWithIndex(int val, int i) {
this.value = val;
this.index = i;
} public int compareTo(ValueWithIndex v2) {
if(value < 0 && v2.value >= 0)
return -1;
if(value >= 0 && v2.value < 0)
return 1;
return value - v2.value;
} public boolean inRangeTWith(ValueWithIndex v2, int t) { // value always >= v2.value
if(value == v2.value)
return true;
if(value >= 0 && v2.value >= 0)
return value - v2.value <= t;
else if(value < 0 && v2.value < 0)
return value <= v2.value + t;
else
return value - t <= v2.value;
}
}
}
二刷:
Java:
使用类似Contains Duplicates II的方法。 Time Complexity - O(n ^ 2) TLE, Space Complexity - O(n)
public class Solution {
public boolean containsNearbyAlmostDuplicate(int[] nums, int k, int t) {
if (nums == null || nums.length < 2) return false;
Set<Integer> set = new HashSet<>(); for (int i = 0; i < nums.length; i++) {
for (int num : set) {
if (Math.abs(num - nums[i]) <= t) return true;
}
set.add(nums[i]);
if (i >= k - 1) set.remove(i - k + 1);
}
return false;
}
}
新建数据结构先排序再查找。
- 这里我们先构建一个Node class包含val和index
- 根据数组,用nums[i]和i作为pair创建Node数组
- 对Node数组使用nums[i]进行排序
- 使用sliding window进行比较,这个部分比较的复杂度其实是O(n)
要注意我们的Node class继承了Comparable<Node> interface, 注意写compareTo() 和 inRangeTWith() 这两个方法时的一些边界条件地处理。
Time Complexity - O(nlogn) , Space Complexity - O(n)
public class Solution {
public boolean containsNearbyAlmostDuplicate(int[] nums, int k, int t) {
if (nums == null || nums.length < 2 || t < 0 || k < 0) return false;
int len = nums.length;
Node[] nodes = new Node[len];
for (int i = 0; i < len; i++) nodes[i] = new Node(nums[i], i);
Arrays.sort(nodes); for (int i = 0; i < len; i++) {
for (int j = i + 1; (j < len) && (nodes[j].inRangeTWith(nodes[i], t)); j++) {
if (Math.abs(nodes[i].index - nodes[j].index) <= k) return true;
}
}
return false;
} private class Node implements Comparable<Node> {
public int val;
public int index; public Node(int val, int i) {
this.val = val;
this.index = i;
} public int compareTo(Node n2) {
if (val < 0 && n2.val >= 0) return -1;
if (val >= 0 && n2.val < 0) return 1;
return val - n2.val;
} public boolean inRangeTWith(Node n2, int t) { // value always >= v2.value
if(val == n2.val) return true;
if((val >= 0 && n2.val >= 0) || (val < 0 && n2.val < 0)) {
return val - n2.val <= t;
} else {
return val <= n2.val - t;
} }
}
}
Reference:
https://leetcode.com/discuss/65056/java-python-one-pass-solution-o-n-time-o-n-space-using-buckets
https://leetcode.com/discuss/47974/java-treeset-implementation-nlogk
https://leetcode.com/discuss/52545/java-solution-without-dictionary-sort-nums-record-positions
https://leetcode.com/discuss/39216/ac-short-java-solution-using-treeset-and-subset-function
https://leetcode.com/discuss/38206/ac-o-n-solution-in-java-using-buckets-with-explanation
https://leetcode.com/discuss/38177/java-o-n-lg-k-solution
https://leetcode.com/discuss/38148/my-o-n-accepted-java-solution-using-hashmap
https://leetcode.com/discuss/38146/java-solution-with-treeset
220. Contains Duplicate III的更多相关文章
- [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 ...
- Java for 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 ...
- (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 ...
- 【LeetCode】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 ...
- 【medium】220. Contains Duplicate III
因为要考虑超时问题,所以虽然简单的for循环也可以做,但是要用map等内部红黑树实现的容器. Given an array of integers, find out whether there ar ...
- 220. Contains Duplicate III 数组指针差k数值差t
[抄题]: Given an array of integers, find out whether there are two distinct indices i and j in the arr ...
- 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 ...
随机推荐
- 【转】Linux杀死fork产生的子进程的僵尸进程defunct
僵尸进程 就是 已经结束,但是还没有清理出去的.用kill -9 $PID 也无法杀死. 所以程序中应该避免出现僵尸进程. 用fork之后,父进程如果没有wait /waitpid 等待子进程的话,子 ...
- C++ VARIANT 学习小记录
一:为什么会有这个? 目前,计算机语言有很多(大哥,为什么不能就那么一样呢?),如C++.Java,此外还有JavaScript.VBScript等脚本语言,它们自立门派,各自维护自己的数据类型. C ...
- oracle的decimal和number的对比
Oracle只是在语法上支持decimal类型,但是在底层实际上它就是number类型,支持decimal类型是为了能把数据从Oracle数据库移到其他数据库中(如DB2等). 因为decimal在O ...
- Mysql slave 同步错误解决
涉及知识点 mysql 主从同步 ,参考: MySQL数据库设置主从同步 mysqlbin log查看, 参考:MySQL的binlog日志 解决slave报错, 参考: Backup stopped ...
- awk!字符问题,修复中!.......
awk '条件类型1{动作1} 条件类型2{动作2}' file1 file2 变量名称:1.NF 每一行($0表示文本所有域)拥有的字段数. 2.NR目前awk处理的"第n行"数 ...
- CCNP第二天 帧中继综合实验
实验题如图所示: 要求全网可达 R5为帧中继交换机 R6 和 R1之间为快速以太网接口 所使用的拓扑为CCNA标准版拓扑图,如下所示: -------------------------------- ...
- Virtual Box中 CentOS双网卡设置
Virtual Box中 CentOS双网卡设置: 在Virtual Box中安装CentOS x86-64 6.4(final),配置了双网卡,eth0 为桥接模式 , eth1为内网模式 ...
- JavaScript 权威指南第6版 - [阅读笔记]
JavaScript 基础 Page 13 (1)<script> 的属性:async,charset,defer='defer',language已废,src,type (2)n ...
- mac 下 配置 xhprof
1: 下载 安装 xhprof wget http://pecl.php.net/get/xhprof-0.9.3.tgztar zxf xhprof-0.9.3.tgzcd xhprof-0.9.3 ...
- DEVICE_ATTR的使用
DEVICE_ATTR的使用 使用DEVICE_ATTR,可以在sys fs中添加“文件”,通过修改该文件内容,可以实现在运行过程中动态控制device的目的. 类似的还有DRIVER_ATTR,BU ...