题目
给定一个整数数组和一个整数 k,判断数组中是否存在两个不同的索引 i 和 j,使得 nums [i] = nums [j],并且 i 和 j 的差的绝对值最大为 k。
示例 1:
输入: nums = [1,2,3,1], k = 3
输出: true
示例 2:
输入: nums = [1,0,1,1], k = 1
输出: true
示例 3:
输入: nums = [1,2,3,1,2,3], k = 2
输出: false
题解
无官方题解
感想
先暴力试了一下,果然时间消耗很大。这个方法在k趋近于n时会退化为O(n^2),所以巨慢。
执行用时 : 681 ms, 在Contains Duplicate II的Java提交中击败了11.67% 的用户
内存消耗 : 41.9 MB, 在Contains Duplicate II的Java提交中击败了95.36% 的用户
class Solution {
public boolean containsNearbyDuplicate(int[] nums, int k) {
if(k<=0) return false;
int[] window = new int[k];
boolean[] save = new boolean[k];
int p = 0;
for(int i=0;i<nums.length;i++){
for(int j=0;j<k;j++){
if(save[j]==true){
if(window[j]==nums[i]) return true;
}
else break;
}
window[p]=nums[i];
save[p]=true;
p=(p+1)%k;
}
return false;
}
}
后来老老实实用hashmap简化一下,复杂度O(n),但是效率感觉还是不够好,可以继续优化。
执行用时 : 25 ms, 在Contains Duplicate II的Java提交中击败了56.20% 的用户
内存消耗 : 51.6 MB, 在Contains Duplicate II的Java提交中击败了16.91% 的用户
class Solution {
public boolean containsNearbyDuplicate(int[] nums, int k) {
if(k<=0) return false;
HashMap<Integer,Integer> hm = new HashMap<>();
for(int i=0;i<nums.length;i++){
if(hm.get(nums[i])!=null && i-hm.get(nums[i])<=k) return true;
else hm.put(nums[i],i);
}
return false;
}
}