[LeetCode] 220. Contains Duplicate III Java

Posted BrookLearnData

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[LeetCode] 220. Contains Duplicate III Java相关的知识,希望对你有一定的参考价值。

题目:

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.

题意及分析:

给出一个数组,要求判断是否存在,对于其中两个不同的元素有:(1) |i-j| <= k (2) |nums[i]-nums[j]| <= t。

方法一:TreeSet(binary search tree)  o(Nlogk)

利用treeset,用floor方法查找treeSet中大于等于当前值且与当前元素距离小于t的最大元素,然后如果该元素不为空,那么就可以找到符合题意的两个元素。

或者用用ceiling方法查找treeSet中大于等于当前值且与当前元素距离小于t的最小元素,然后如果该元素不为空,那么就可以找到符合题意的两个元素。

最后需要注意的一点,就是两个元素之间的距离要小于等于k,即|i-j|<=k,所以当前treeSet中最多只能有k个元素。

代码:

class Solution {
    public boolean containsNearbyAlmostDuplicate(int[] nums, int k, int t) {
       if(nums==null||nums.length==0||k<=0) return false;

       TreeSet<Long> treeSet = new TreeSet<Long>();
       for(int i=0;i<nums.length;i++){

           final Long floor = treeSet.floor((long)nums[i]+t);
           final Long ceil = treeSet.ceiling((long)nums[i]-t);

           if((floor!=null&&floor>=(long)nums[i])||
                   (ceil!=null&&ceil<=(long)nums[i])){
               return true;
           }

           treeSet.add((long)nums[i]);
           if(i>=k){        //因为元素的坐标差不能超过k,所以在treeSet中最多只能有k个元素
               treeSet.remove((long)nums[i-k]);
           }
       }
        return false;
    }
}

 

方法二:窗口滑动  o(n)

  

 

以上是关于[LeetCode] 220. Contains Duplicate III Java的主要内容,如果未能解决你的问题,请参考以下文章

[Leetcode]220. Contains Duplicate III

[LeetCode] 220. Contains Duplicate III Java

Leetcode 220. 存在重复元素 III (Contains Duplicate III)

leetcode 220. Contains Duplicate III 求一个数组中有没有要求的元素 ---------- java

220. Contains Duplicate III

220. Contains Duplicate III