题目
这题本来想用滑动窗口做
int left = 0, right = 0, len = k+1;
while(right < nums.length){
while(left < nums.length-1){
left++;
if(nums[right] == nums[left]){
len = Math.min(len, Math.abs(right - left));
}
}
right++;
left = right;
}
return len <= k ? true : false;
但报了超时,于是改为hash
class Solution {
public boolean containsNearbyDuplicate(int[] nums, int k) {
Map<Integer, int[]> map = new HashMap<Integer, int[]>();
for(int i = 0; i < nums.length; i++){
if(map.containsKey(nums[i])){
map.get(nums[i])[0] = Math.min(i - map.get(nums[i])[1], map.get(nums[i])[0]);
if(map.get(nums[i])[0] <= k){
return true;
}
map.get(nums[i])[1] = i;
}else{
map.put(nums[i], new int[]{k+1,i});
}
}
return false;
}
}
此类题的特点为并非让求最值,所以可以边循环边判断,满足条件即可break。