码迷,mamicode.com
首页 > 其他好文 > 详细

Leetcode: Contains Duplicate III

时间:2017-11-18 11:15:52      阅读:145      评论:0      收藏:0      [点我收藏+]

标签:div   har   ice   leetcode   add   sharp   near   ++   remove   

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.

时间 O(NlogK) 空间 O(K)

思路

要求判断之前是否存在差值小于t的数字,我们需要知道在当前数字x两边的数字,即最大的小于x的数字和最小的大于x的数字。二叉搜索树有也有这样的性质,它的左子树的最右节点是最大的较小值,右子树的最左节点是最小的较大值。这里我们用TreeSet这个类,它实现了红黑树,并有集合的性质,非常适合这题。我们同样也是维护一个大小为k的TreeSet,多余k个元素时把最早加入的给删除。用ceiling()和floor()可以找到最小的较大值和最大的较小值。

public class Solution {
    public boolean containsNearbyAlmostDuplicate(int[] nums, int k, int t) {
        TreeSet<Integer> set = new TreeSet<Integer>();
        for(int i = 0; i < nums.length; i++){
            int x = nums[i];
            // 最小的大于x的数字
            if(set.ceiling(x) != null && set.ceiling(x) <= t + x) return true;
            // 最大的小于x的数字
            if(set.floor(x) != null && x <= t + set.floor(x)) return true;
            set.add(x);
            if(set.size()>k) set.remove(nums[i-k]);
        }
        return false;
    }
}

  

Leetcode: Contains Duplicate III

标签:div   har   ice   leetcode   add   sharp   near   ++   remove   

原文地址:http://www.cnblogs.com/apanda009/p/7854274.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!