【LeetCode】存在重复元素 II Java题解

101 阅读1分钟

这是我参与2022首次更文挑战的第2天,活动详情查看:2022首次更文挑战

题目描述

给你一个整数数组 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

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/contains-duplicate-ii
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

思路分析

  • 今天的算法每日一题是数组题目,题意比较简单,需要判断是否包含重复元素,重复元素的定义是满足存在两个 不同的索引 i 和 j ,满足 nums[i] == nums[j] 且 abs(i - j) <= k
  • 根据重复元素的定义,我们首先写出朴素解法,遍历每一个元素,由于需要两个数比较,我们需要设定两个数,嵌套循环,时间复杂度较高!
  • 在朴素解法中,每个数都计算了两次,重复计算多,我们可以把遍历过的数字都记录下来,减少重复计算,因此,可以使用 hashMap 记录数组中遍历过的元素,降低时间复杂度,提升判断执行效率。具体实现代码如下,供参考。

通过代码

  • 朴素解法
class Solution {
    public boolean containsNearbyDuplicate(int[] nums, int k) {
        int n = nums.length;
        for (int i = 0; i < n; i++) {
            for (int j = i + 1; Math.abs(i - j) <= k && j < n; j++) {
                if (nums[i] == nums[j]) {
                    return true;
                }
            }
        }

        return false;
    }
}
  • hashMap解法
    public boolean containsNearbyDuplicate(int[] nums, int k) {
        int n = nums.length;
        Map<Integer, Integer> map = new HashMap<>();
        for (int i = 0; i < n; i++) {
            int temp = nums[i];
            if (map.containsKey(temp) && Math.abs(map.get(temp) - i) <= k) {
                return true;
            }
            map.put(temp, i);
        }

        return false;
    }

image.png

总结

  • 朴素解法的时间复杂度是O(n * n), 空间复杂度是O(1)
  • hashMap 解法的时间复杂度是O(n), 空间复杂度是O(n)
  • 坚持算法每日一题,加油!