题目:
给你一个整数数组 nums 和一个整数 k ,判断数组中是否存在两个 不同的索引 i 和 j ,满足 nums[i] == nums[j] 且 abs(i - j) <= k 。如果存在,返回 true ;否则,返回 false 。
示例 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
解题思路:
两个for循环,结果超时了
class Solution {
public int abs(int a){
if(a>=0){
return a;
}
else{
return 0-a;
}
}
public boolean containsNearbyDuplicate(int[] nums, int k) {
for(int i=0;i<nums.length;i++){
for(int j=i+1;j<nums.length;j++){
if(nums[i]==nums[j]&&abs(i-j)<=k){
return true;
}
}
}
return false;
}
}
看了别人的解法,把索引的绝对值的差值小于k这个条件放到了for循环里就没有超时
class Solution {
public boolean containsNearbyDuplicate(int[] nums, int k) {
for(int i=0;i<nums.length;i++){
for(int j=i+1;j<nums.length&&j<i+1+k;j++){
if(nums[i]==nums[j]){
return true;
}
}
}
return false;
}
}
我觉得没超时的原因:j+i+1+k,索引值的差值小于k,那么大于k的值就不用遍历了;如果绝对值的条件不在for里,那每一个(nums[i], nums[j])都需要进去比较,但是如果加这个条件到for里,就只有符合绝对值要求的(nums[i], nums[j])才需要进去比较,不符合的话就下一轮了