1.线性搜索
class Solution { public boolean containsNearbyDuplicate(int[] nums, int k) { for(int i=0;i<nums.length;i++){ for(int j=i+1;j<nums.length&&j<=i+k;j++){ if(nums[i]==nums[j]) return true; } } return false; } }这时间复杂度让我想哭
2.散列表
class Solution { public boolean containsNearbyDuplicate(int[] nums, int k) { Set<Integer> res = new HashSet<Integer>(); for(int i=0;i<nums.length;i++){ if(!res.add(nums[i])) return true; if(res.size()>k) res.remove(nums[i-k]); } return false; } }
这个相当于保持res集合为k大小
例子:[4,1,2,3,5,1,5] 3
如果res里没有这个数,就往里加 4,1,2,3
这时候res.size=4>k=3 所以,要去除第一个元素4,对于i=4时的5而言,他只需要和前面1,2,3比,4已经超出k的范围了