leetcode解题之存在重复元素 II

给定一个整数数组和一个整数 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;
    }
}
发布了98 篇原创文章 · 获赞 0 · 访问量 4005

猜你喜欢

转载自blog.csdn.net/l888c/article/details/104376021