给定一个整数数组和一个整数 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
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/contains-duplicate-ii
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
一开始理解题目有误,以为nums[i]==nums[j]时索引的差的绝对值不能比k大,如果存在比k大的结果,就是false,代码如下
class Solution {
public boolean containsNearbyDuplicate(int[] nums, int k) {
int tem = 0;
for(int i=0;i<nums.length-1;i++){
for(int j=i+1;j<nums.length;j++){
if(nums[i]==nums[j]){
tem=Math.max(tem,Math.abs(i-j));
}
}
}
return tem==k;
}
}
这样简单的测试用例是通过了,但是对于
输入:
[1,0,1,1]
1
是不对的,题目的本意是只要存在一个符合要求的就返回true,再次修改
class Solution {
public boolean containsNearbyDuplicate(int[] nums, int k) {
for(int i=0;i<nums.length-1;i++){
for(int j=i+1;j<nums.length;j++){
if(nums[i]==nums[j]&&Math.abs(i-j)==k){
return true;
}
}
}
return false;
}
}
又错了,对于
输入:
[99,99]
2
差的绝对值可以比k小,最终如下
class Solution {
public boolean containsNearbyDuplicate(int[] nums, int k) {
for(int i=0;i<nums.length-1;i++){
for(int j=i+1;j<nums.length;j++){
if(nums[i]==nums[j]&&Math.abs(i-j)<=k){
return true;
}
}
}
return false;
}
}
还可以是用哈希表来解
class Solution {
public boolean containsNearbyDuplicate(int[] nums, int k) {
Map<Integer,Integer> map = new HashMap();
for(int i=0;i<nums.length;i++){
if(map.containsKey(nums[i])){
if(Math.abs(i-map.get(nums[i]))<=k){
return true;
}
}
map.put(nums[i],i);//nums[i]==nums[j]但大于k时,将重置计算的起始索引
}
return false;
}
}