题目:
给定一个整数数组和一个整数 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
思路一:
判断是否存在两个,只要存在两个并且满足条件即返回true
使用哈希表遍历整个数组
先判断是否有重复的元素,如果有重复的元素返回true
在往哈希表中添加元素
如果超出窗口k 则删除k之前的元素
classSolution{publicbooleancontainsNearbyDuplicate(int[] nums,int k){
Set<Integer> set=newHashSet<>();for(int i=0; i< nums.length;++i){if(set.contains(nums[i]))returntrue;
set.add(nums[i]);if(set.size()> k){
set.remove(nums[i- k]);}}returnfalse;}}
主次关系不要弄混
先判定是否有重复元素,在添加元素
如果添加元素后,又判断哈希表中有该元素,无论如何都会返回true
思路二:
用平衡二叉树的解决方法
定义一个Treeset
publicbooleancontainsNearbyDuplicate(int[] nums,int k){
Set<Integer> set=newTreeSet<>();for(int i=0; i< nums.length;++i){if(set.contains(nums[i]))returntrue;
set.add(nums[i]);if(set.size()> k){
set.remove(nums[i- k]);}}returnfalse;}
结果显示定义超时,但思路想法是对的