标签:
原题链接在这里:https://leetcode.com/problems/contains-duplicate-iii/
借助于TreeSet的subSet函数,看是否有[nums[i]-t, nums[i]+t+1)范围内的数。
维护一个长度为k的窗口,超过了这个长度时就把前面的元素从window中拿出去。
若在window长度范围内,就把nums[i]加进window中。
Note: 若i>=k, 就把这个nums[i-k]从window中拿出去,因为i是从0开始, k是从1开始。
subSet返回的是SortSet型object, 范围是[low,high), 注意是左闭右开。
Time Complexity is O(nlogk). window 的长度为k, TreeSet的contains, insert, delete用时都是O(log k). Space O(k).
AC Java:
1 public class Solution { 2 public boolean containsNearbyAlmostDuplicate(int[] nums, int k, int t) { 3 if(nums == null || nums.length < 2 || k < 1 || t < 0){ 4 return false; 5 } 6 7 SortedSet<Long> window = new TreeSet<Long>(); 8 for(int i = 0; i<nums.length; i++){ 9 SortedSet<Long> subSet = window.subSet((long)nums[i]-t, (long)nums[i]+t+1); 10 if(!subSet.isEmpty()){ 11 return true; 12 } 13 if(i>=k){ 14 window.remove((long)nums[i-k]); 15 } 16 window.add((long)nums[i]); 17 } 18 return false; 19 } 20 }
LeetCode Contains Duplicate III
标签:
原文地址:http://www.cnblogs.com/Dylan-Java-NYC/p/4924607.html