Given an array of integers and an integer k, find out whether there are two distinct indices i and j in the array such that nums[i] = nums[j] and the absolutedifference between i and j is at most k.
Example 1:
Input: nums = [1,2,3,1], k = 3 Output: true
Example 2:
Input: nums = [1,0,1,1], k = 1 Output: true
Example 3:
Input: nums = [1,2,3,1,2,3], k = 2 Output: false
解法:
这道题还是比较鸡贼的,注意一个testcase: [1,0,1,1] k=1,一开始没注意更新1的位置导致这种情况被判断为false。
用HashMap解决,比较简单,唯一就是要在每次都把map里面的值更新一下,为啥呢?因为遇到同样的数但是不满足的时候,取一个新的数必然才有机会找到最小距离(很显然)。比如上吗的1,0,1,1。如果在第二个1的时候发现其实还是比1大,这个时候需要将第二个1 set进去map,保持还有找到最小距离的希望!
class Solution {
public boolean containsNearbyDuplicate(int[] nums, int k) {
int len = nums.length;
if(len == 0) return false;
HashMap<Integer,Integer> hm = new HashMap<Integer,Integer>();
for(int i=0;i<len;i++){
if(hm.get(nums[i])!=null){
if(i-hm.get(nums[i])<=k)return true;
}
hm.put(nums[i],i); //如果不存在这样的数,需要把新的数set到位置上,保证距离最近
}
return false;
}
}