Description:
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.
Solution:
用一个数据结构,能够维护长度为K的列表,同时又有floor和ceiling功能即可。
这里是用TreeSet,也可以用SortedSet。
import java.util.*;
public class Solution {
public boolean containsNearbyAlmostDuplicate(int[] nums, int k, int t) {
if (k < 1 || t < 0)
return false;
TreeSet<Integer> set = new TreeSet<Integer>();
int n = nums.length;
long number;
for (int i = 0; i < n; i++) {
if (set.floor((nums[i])) != null) {
number = set.floor((nums[i]));
if (number >= nums[i] - t)
return true;
}
if (set.ceiling(nums[i]) != null) {
number = set.ceiling(nums[i]);
if (number <= nums[i] + t)
return true;
}
set.add(nums[i]);
if (i >= k) {
set.remove(nums[i - k]);
}
}
return false;
}
public static void main(String[] args) {
Solution s = new Solution();
System.out.println(s.containsNearbyAlmostDuplicate(new int[] { 2, 4 },
1, 1));
}
}