这是我参与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;
}
总结
- 朴素解法的时间复杂度是O(n * n), 空间复杂度是O(1)
- hashMap 解法的时间复杂度是O(n), 空间复杂度是O(n)
- 坚持算法每日一题,加油!