这个问题 课程代码:
public static boolean containsNearbyDuplicate2(int[] nums, int k) {
//遍历nums中范围的值 这里用list 删除元素会错乱
Set<Integer> set = new HashSet<>();
for (int i = 0; i < nums.length; i++) {
int num = nums[i];
if (set.contains(num)) {
return true;
}
set.add(num);
if (set.size() == k + 1) {
set.remove(nums[i - k]);
}
}
老师 我用list这个解法就是错的,我debug打印几次list发现 list.remove 当是Integer时 集合List他不知道时删除元素还是删除索引,所以会错乱,但是我这里还是有点怀疑,list顺序添加 可以顺序取出的吧? 这个问题不能用list的原因是因为 remove这个方法的原因吗?
课程解法:
public boolean containsNearbyAlmostDuplicate(int[] nums, int k, int t) {
if (nums.length == 0)
return false;
TreeSet<Long> set = new TreeSet<>();
for (int i = 0; i < nums.length; i++) {
long num = nums[i];
//num-t<= x <=num+t 查看是否存在这个x 找到大于 num-t的最小值 同时 这个值在[num-t,num+t]这个范围内就是成功的
Long ceiling = set.ceiling((long)num - t);
if (ceiling != null && ceiling <=(long) num + t)
return true;
set.add(num);
if (set.size() == k + 1) {
set.remove((long)nums[i - k]);
}
}
return false;
}
这里有1个问题:
对于k 我们用Set存 如果遇到重复元素 那么Set.size()>=k ,按照思想这个是一定的。但是看leetcode说根据我们的判断遇到重复元素会直接true,这是为什么,我们找到合适的例子,辛苦老师帮我解释下,最好能有个例子,我动笔试试