【LetMeFly】219.存在重复元素 II:哈希表 力扣题目链接:https://leetcode.cn/problems/contains-duplicate-ii/
给你一个整数数组 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
提示:
1 <= nums.length <= 105
-109 <= nums[i] <= 109
0 <= k <= 105
解题方法:哈希表 使用哈希表记录每个元素最后一次出现的位置。
遍历nums
数组,如果当前元素在哈希表中出现过并且这次和上次出现位置只差不超过$k$,则返回true
。
每次遍历完一个数组,更新哈希表中这个数字的“最后出现位置”。
时间复杂度$O(len(nums))$
空间复杂度$O(len(nums))$
AC代码 C++ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 class Solution {public : bool containsNearbyDuplicate (vector<int >& nums, int k) { unordered_map<int , int > ma; for (int i = 0 ; i < nums.size (); i++) { if (ma.count (nums[i]) && i - ma[nums[i]] <= k) { return true ; } ma[nums[i]] = i; } return false ; } };
Python 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 ''' Author: LetMeFly Date: 2025-01-29 11:51:06 LastEditors: LetMeFly.xyz LastEditTime: 2025-01-29 11:51:09 ''' from typing import List class Solution : def containsNearbyDuplicate (self, nums: List [int ], k: int ) -> bool : ma = dict () for i, t in enumerate (nums): if t in ma and i - ma[t] <= k: return True ma[t] = i return False
Java 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 import java.util.HashMap;class Solution { public boolean containsNearbyDuplicate (int [] nums, int k) { HashMap<Integer, Integer> ma = new HashMap <>(); for (int i = 0 ; i < nums.length; i++) { if (i - ma.getOrDefault(nums[i], -1000000 ) <= k) { return true ; } ma.put(nums[i], i); } return false ; } }
Go 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 package mainfunc containsNearbyDuplicate (nums []int , k int ) bool { ma := map [int ]int {} for i, t := range nums { if p, ok := ma[t]; ok && i - p <= k { return true } ma[t] = i } return false }
Happy New Year! 健康第一。
同步发文于CSDN和我的个人博客 ,原创不易,转载经作者同意后请附上原文链接 哦~
Tisfy:https://letmefly.blog.csdn.net/article/details/145392757