题目:

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,发现有大概三种解法。

  1. Sort the array, keep original index
  2. TreeMap
  3. 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;
}
}

新建数据结构先排序再查找。

  1. 这里我们先构建一个Node class包含val和index
  2. 根据数组,用nums[i]和i作为pair创建Node数组
  3. 对Node数组使用nums[i]进行排序
  4. 使用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的更多相关文章

  1. [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 ...

  2. 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 ...

  3. (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 ...

  4. 【LeetCode】220. Contains Duplicate III

    题目: Given an array of integers, find out whether there are two distinct indices i and j in the array ...

  5. [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 ...

  6. 【medium】220. Contains Duplicate III

    因为要考虑超时问题,所以虽然简单的for循环也可以做,但是要用map等内部红黑树实现的容器. Given an array of integers, find out whether there ar ...

  7. 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 ...

  8. 220 Contains Duplicate III 存在重复 III

    给定一个整数数组,判断数组中是否有两个不同的索引 i 和 j,使 nums [i] 和 nums [j] 的绝对差值最大为 t,并且 i 和 j 之间的绝对差值最大为 k. 详见:https://le ...

  9. 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 ...

随机推荐

  1. c++ primer (5)1

    第一章 1.包含来自标准库的头文件用<>,不属于标准库用"". 2.默认情况,读cin会刷新cout:程序非正常终止时也会刷新cout. 3.默认情况,cerr不缓冲, ...

  2. 何谓IOC的核心思想

    IOC(Inversion of Control)即控制反转,是在面试或平常交流中经常遇到了词汇:我也曾经仿照Spring,利用JDK的反射和动态代理实现了一个简单的IOC框架,感觉算是知其然也知其所 ...

  3. SSH连接时出现Host key verification failed的原因及解决方法

    SSH连接的时候Host key verification failed. [root@cache001 swftools-0.9.0]# ssh 192.168.1.90@@@@@@@@@@@@@@ ...

  4. location跳转和header跳转的区别

    1:header("location:url") 跳转之前不能有任何输出,如果想在header之前有输出,则要修改php.ini文件.具体 output_handler =mb_o ...

  5. Delphi摄像头操作

    /*Title:Delphi摄像头操作 *Author:Insun *Blog:http://yxmhero1989.blog.163.com *From:www.4safer.com */ 为了笔耕 ...

  6. VB6-操作数据库

    平常搞数据库操作多了就想把经常用的内容放在一起,我也懒,在一本书里的工程例子挑了一个bas,修修改改,凑合这用吧. Public strCnn As String '数据库连接字符串 Public A ...

  7. Pandas之容易让人混淆的行选择和列选择

    在刚学Pandas时,行选择和列选择非常容易混淆,在这里进行一下讨论和归纳 本文的数据来源:https://github.com/fivethirtyeight/data/tree/master/fa ...

  8. How to install Hadoop

    1.How to install Hadoop 3.0.0 http://blog.sina.com.cn/s/blog_4a1f59bf01010kx3.html 2.How to install ...

  9. The Best Rank (25)(排名算法)

    To evaluate the performance of our first year CS majored students, we consider their grades of three ...

  10. JavaScript技巧45招

    原文:45 Useful JavaScript Tips, Tricks and Best Practices作者:Saad Mousliki 在这篇文章里,我将分享一些JavaScript的技巧.秘 ...