1.题目
给你一个整数数组 nums
和一个整数 k
,判断数组中是否存在两个 不同的索引 i
和 j
,满足 nums[i] == nums[j]
且 abs(i - j) <= k
。如果存在,返回 true
;否则,返回 false
。
2.示例
示例 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
提示
1 <= nums.length <= 105
-109 <= nums[i] <= 109
0 <= k <= 105
3.思路
哈希表:
首先看到数组中需要用到索引与对应的值,很明显就能联想到哈希表数据结构与相关查找以减少查找速度,通过遍历数组将未存在于表中的数据与相应的索引存入哈希表中,然后如果遇到存在的键值的数据则找到数据的索引与当前遍历的值进行绝对值相减获取结果进行判定如果符合则返回true。如果遍历结束都没有满足则返回false
4.代码
LeetCode代码
class Solution {
public boolean containsNearbyDuplicate(int[] nums, int k) {
int temp;
HashMap<Integer,Integer> map = new HashMap<>();
for (int i=0;i< nums.length;i++){
if (map.containsKey(nums[i])){
temp = map.get(nums[i]);
if (Math.abs(temp-i)<=k){
return true;
}
}
map.put(nums[i],i);
}
return false;
}
}
时间复杂度为O(n),O(1)
案例详细代码:
package LeetCode18;
import java.util.HashMap;
public class javaDemo {
public static void main(String[] args) {
int nums[]= new int[]{1,2,3,1};
int k = 3;
// 中间量
int temp;
boolean flag = false;
// 创建哈希表
HashMap<Integer,Integer> map = new HashMap<>();
// 循环遍历
for (int i=0;i< nums.length;i++){
// 查找是否已经存在一样的值
if (map.containsKey(nums[i])){
temp = map.get(nums[i]);
// 判断两者绝对值差值是否小于等于k
if (Math.abs(temp-i)<=k){
flag = true;
break;
}
}
// 如果不存在键则把键值都存放到哈希表
map.put(nums[i],i);
}
// 输出结果
System.out.println(flag);
}
}
会了?试试挑战下一题!♪(^∀^●)ノシ (●´∀`)♪
LeetCode150道面试经典题-- 快乐数(简单)_Alphamilk的博客-CSDN博客