以为要记录duplicate的位置 所以想到了用一个hash map key是值 value是一个位置array
首先list的操作不熟悉 list要用arraylist实现 并且要记得用add,取值用get
hashmap是使用put,get
public class Solution {
public boolean containsNearbyDuplicate(int[] nums, int k) {
HashMap<Integer, List<Integer>> map = new HashMap<Integer, List<Integer>>();
for ( int i = 0; i < nums.length; i ++ ){
if ( map.containsKey ( nums[i] )){
for ( int j = 0; j < map.get( nums[i] ).size(); j ++ ){
if ( Math.abs( map.get(nums[i]).get(j) - i ) <= k)
return true;
}
map.get( nums[i] ).add(i);
}
else {
List<Integer> list = new ArrayList<Integer>();
list.add(i);
map.put( nums[i], list);
}
}
return false;
}
}
发现了一个更简便方法,就是从前往后扫的时候 假如访问到了第k个之后的,那每次删除set里面的最开头的一个就可以了
public class Solution {
public boolean containsNearbyDuplicate(int[] nums, int k) {
HashSet<Integer> set = new HashSet<Integer>();
for ( int i = 0; i < nums.length; i ++ ){
if ( i > k ){
set.remove( nums[i - k - 1] );
}
if ( set.contains(nums[i]))
return true;
else
set.add(nums[i]);
}
return false;
}
}