题目:

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

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

解题思路:

一、哈希表--模拟暴力求解

今天完全没看题解,解出来一道简单题,虽然很垃圾,但是还是开心的~

1.创建一个哈希表,用于将遍历的数字以 (nums[i], i) 键值对的形式存储;

2.然后遍历数组各元素,如果哈希表中不存在当前 nums[i] 则存入它的值和下标到哈希表中,如果已经存在当前 nums[i] :

  • 从哈希表中获取已存在数字的下标 j ,计算出下标之间的差值 count =  j - i(这里我感觉不用计算绝对值,因为后面的下标值肯定比已存在哈希表中的下标值大);
  • 判断count是否小于等于k,如是,则返回true,如不是,则将之前已经存在的元素删去,再存入当前值 nums[i] 和下标 i;

3.如果遍历完都不存在满足count <= k,则返回false。

java代码:

 1 class Solution {
2 public boolean containsNearbyDuplicate(int[] nums, int k) {
3 Map<Integer, Integer> map = new HashMap<>();
4 for(int i = 0; i < nums.length; i++){
5 if(map.containsKey(nums[i])){
6 int j = map.get(nums[i]);
7 int count = i - j;
8 if(count <= k){
9 return true;
10 }else{
11 map.remove(nums[j]);
12 map.put(nums[i], i);
13 }
14 }else{
15 map.put(nums[i], i);
16 }
17 }
18 return false;
19 }
20 }

 二、滑动窗口

相当于一直维护一个大小为K的滑动窗口一直往前走,判断窗口内是否有重复元素。从前往后遍历数组元素,来记录创建一个HashSet,利用它来记录当前滑窗中出现的元素。假设当前遍历的元素为 nums[i]:

  • 如果当前set中的元素长度小于k:直接往滑窗加数,将当前元素加入 Set 中,遇到重复元素,则说明在k距离内存在重复元素,返回true;
  • 如果当前set中的元素长度大于k:将上一滑窗的最左端的元素 nums[i - k ] 移除。

如果遍历完数组中的元素没找到k距离内存在重复元素,则返回false。

关键图解:来自@画手大鹏

当遍历到i=2时nums[i] = 3,Set中不包含3,将3加入Set,Set的长度大于k,则移除窗口最左端的元素1;

当遍历到i=3时nums[i] = 1,之前的1已经被移除了,Set中不包含1,将1加入Set,Set的长度大于k,则移除窗口最左端的元素2;

当遍历到i=4时nums[i] = 3,3存在Set中,说明在k距离内存在重复元素,返回true;

java代码:

 1 class Solution {
2 public boolean containsNearbyDuplicate(int[] nums, int k) {
3 Set<Integer> set = new HashSet<>();
4 for(int i = 0; i < nums.length; i++){
5 if(set.contains(nums[i])){
6 return true;
7 }
8 set.add(nums[i]);
9 if(set.size() > k){
10 set.remove(nums[i - k]);
11 }
12 }
13 return false;
14 }
15 }

 python3代码:

 1 class Solution:
2 def containsNearbyDuplicate(self, nums: List[int], k: int) -> bool:
3 s = set()
4 n = len(nums)
5 for i in range(n):
6 if nums[i] in s:
7 return True
8 s.add(nums[i])
9 if len(s) > k:
10 s.remove(nums[i - k])
11 return False

注意:

创建集合可以用{}或set()创建集合,但是创建空集合必须用set(),因为{}创建的是空字典。

力扣219(java&python)-存在重复元素 II(简单)的更多相关文章

  1. Java实现 LeetCode 219 存在重复元素 II(二)

    219. 存在重复元素 II 给定一个整数数组和一个整数 k,判断数组中是否存在两个不同的索引 i 和 j,使得 nums [i] = nums [j],并且 i 和 j 的差的绝对值最大为 k. 示 ...

  2. Java实现 LeetCode 82 删除排序链表中的重复元素 II(二)

    82. 删除排序链表中的重复元素 II 给定一个排序链表,删除所有含有重复数字的节点,只保留原始链表中 没有重复出现 的数字. 示例 1: 输入: 1->2->3->3->4- ...

  3. LeetCode-082-删除排序链表中的重复元素 II

    删除排序链表中的重复元素 II 题目描述:存在一个按升序排列的链表,给你这个链表的头节点 head ,请你删除链表中所有存在数字重复情况的节点,只保留原始链表中 没有重复出现 的数字. 返回同样按升序 ...

  4. LeetCode 82. 删除排序链表中的重复元素 II(Remove Duplicates from Sorted List II)

    82. 删除排序链表中的重复元素 II 82. Remove Duplicates from Sorted List II 题目描述 给定一个排序链表,删除所有含有重复数字的节点,只保留原始链表中没有 ...

  5. 【每日算法】存在重复元素 II

    题目描述 这是 LeetCode 上的 219. 存在重复元素 II, 难度为 [简单] 给定一个整数数组和一个整数 k,判断数组中是否存在两个不同的索引 i 和 j,使得 nums [i] = nu ...

  6. 【力扣】122. 买卖股票的最佳时机 II

    给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格. 设计一个算法来计算你所能获取的最大利润.你可以尽可能地完成更多的交易(多次买卖一支股票). 注意:你不能同时参与多笔交易(你必须在再次 ...

  7. LeetCode 82,考察你的基本功,在有序链表中删除重复元素II

    本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是LeetCode专题的第51篇文章,我们来看LeetCode第82题,删除有序链表中的重复元素II(Remove Duplicates ...

  8. leetcode 83. 删除排序链表中的重复元素 及 82. 删除排序链表中的重复元素 II

    83. 删除排序链表中的重复元素 问题描述 给定一个排序链表,删除所有重复的元素,使得每个元素只出现一次. 示例 1: 输入: 1->1->2 输出: 1->2 示例 2: 输入: ...

  9. 力扣 ——Remove Duplicates from Sorted List II(删除排序链表中的重复元素 II)python实现

    题目描述: 中文: 给定一个排序链表,删除所有含有重复数字的节点,只保留原始链表中 没有重复出现 的数字. 示例 1: 输入: 1->2->3->3->4->4-> ...

  10. 力扣(LeetCode)删除排序链表中的重复元素II 个人题解

    给定一个排序链表,删除所有含有重复数字的节点,只保留原始链表中 没有重复出现 的数字. 思路和上一题类似(参考 力扣(LeetCode)删除排序链表中的重复元素 个人题解)) 只不过这里需要用到一个前 ...

随机推荐

  1. dist目录打war包命令 jar -cvf yourName_web.war *

    进入dist目录 "build:war": "cd dist && jar -cvf ../yourName_web.war *",

  2. Java使用Steam流对数组进行排序

    原文地址:Java使用Steam流对数组进行排序 - Stars-One的杂货小窝 简单记下笔记,不是啥难的东西 sorted()方法里传了一个比较器的接口 File file = new File( ...

  3. Vuejs右键弹出菜单

    一.安装 npm install @xunlei/vue-context-menu 二.修改main.js import VueContextMenu from '@xunlei/vue-contex ...

  4. 视野修炼-技术周刊第76期 | Rolldown 开源

    欢迎来到第 76 期的[视野修炼 - 技术周刊],下面是本期的精选内容简介 强烈推荐 Rolldown 开源 - Rollup 的锈化版 前端调试工具超全汇总 开源工具&技术资讯 OhMyLi ...

  5. 对角矩阵try

    \begin{bmatrix}1 & 0 & 0\\ 0 & 1 & 0\\ 0 & 0 & 1\end{bmatrix}

  6. [TM4]TM4C123G使用笔记

    [TM4]TM4C123G使用笔记 TI的板子真让人头大甚至重装了两遍KEIL5 如何用keil5新建工程可以参考如下博客: https://blog.csdn.net/D_XingGuang/art ...

  7. KingbaseES Json 系列三:Json数据操作函数一

    KingbaseES Json 系列三--Json数据操作函数一(JSONB_EACH,JSONB_EACH_TEXT,JSONB_OBJECT_KEYS,JSONB_EXTRACT_PATH,JSO ...

  8. SQL优化篇之-如何减少耗时查询的调用次数

    函数调用次数与性能 在查询语句中,如果 Select 子句调用了较为耗时的函数或子查询,需要特别考虑函数调用次数对于SQL整体执行时间的影响. 一.数据准备,SQL 语句 模拟较耗时的用户函数 确保执 ...

  9. KingbaseES V8R3集群部署案例之---通用机无ssh环境脚本部署集群

    案例说明: 在一些通用机的生产环境,不允许主机之间通过ssh通讯,或者不允许root用户建立ssh互信或登录.默认KingbaseES V8R3集群通用机环境部署需要建立数据库用户及root用户,在集 ...

  10. C++中自定义事件与委托

    自定义事件,和委托其实是一类操作. 在蓝图中都表现为红色方块. 自定义事件通过DECLARE_EVENT(ClassName, EventName)来创建一个属于ClassName的EventName ...