力扣第219题-存在重复元素II

1. 题目描述

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

2 解题思路

2.1 方法一:暴力滑动窗口

这种思路很简单,就是使窗口大小为 2 ~ len(nums) - 1,然后让窗口向后滑动,寻找满足条件的数据。

但是!!!这种方法毫无疑问时间复杂度过高!

代码实现:

class Solution:
 def containsNearbyDuplicate(self, nums: List[int], k: int) -> bool:
 # 方法一:滑动窗口
 for window_width in range(1, len(nums)):
 for i in range(len(nums) - window_width):
 if nums[i] == nums[i + window_width] and window_width <= k:
 return True
 return False

2.2 哈希表

下面有请我们的老朋友--哈希表。

思路是这样的:我们遍历一遍nums列表,注意需要使用到index和值,如果列表元素不在哈希表中或者 (列表元素在哈希表中)但是当前的索引-这个元素在哈希表中对应的值(其实就是旧的index)大于k,那么说就让hashmap[num] = index,将值和index存进哈希表中或者进行更新,否则的话(这个元素在哈希表中并且索引的差值小于等于k,那么正好满足条件)。

代码实现:

class Solution:
 def containsNearbyDuplicate(self, nums: List[int], k: int) -> bool:
 # 方法二:哈希表
 hashmap = {}
 for index, num in enumerate(nums):
 if num in hashmap and index - hashmap[num] <= k:
 return True
 hashmap[num] = index
 return False

注意:上述代码参考力扣官方题解!

3. 总结

遇到数组相关的难题,可以思考使用哈希表,往往会有很好的效果。

作者:想你时风起原文地址:https://www.cnblogs.com/wephiles/p/18782129

%s 个评论

要回复文章请先登录注册