力扣219(java&python)-存在重复元素 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
来源:力扣(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(简单)的更多相关文章
- Java实现 LeetCode 219 存在重复元素 II(二)
219. 存在重复元素 II 给定一个整数数组和一个整数 k,判断数组中是否存在两个不同的索引 i 和 j,使得 nums [i] = nums [j],并且 i 和 j 的差的绝对值最大为 k. 示 ...
- Java实现 LeetCode 82 删除排序链表中的重复元素 II(二)
82. 删除排序链表中的重复元素 II 给定一个排序链表,删除所有含有重复数字的节点,只保留原始链表中 没有重复出现 的数字. 示例 1: 输入: 1->2->3->3->4- ...
- LeetCode-082-删除排序链表中的重复元素 II
删除排序链表中的重复元素 II 题目描述:存在一个按升序排列的链表,给你这个链表的头节点 head ,请你删除链表中所有存在数字重复情况的节点,只保留原始链表中 没有重复出现 的数字. 返回同样按升序 ...
- LeetCode 82. 删除排序链表中的重复元素 II(Remove Duplicates from Sorted List II)
82. 删除排序链表中的重复元素 II 82. Remove Duplicates from Sorted List II 题目描述 给定一个排序链表,删除所有含有重复数字的节点,只保留原始链表中没有 ...
- 【每日算法】存在重复元素 II
题目描述 这是 LeetCode 上的 219. 存在重复元素 II, 难度为 [简单] 给定一个整数数组和一个整数 k,判断数组中是否存在两个不同的索引 i 和 j,使得 nums [i] = nu ...
- 【力扣】122. 买卖股票的最佳时机 II
给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格. 设计一个算法来计算你所能获取的最大利润.你可以尽可能地完成更多的交易(多次买卖一支股票). 注意:你不能同时参与多笔交易(你必须在再次 ...
- LeetCode 82,考察你的基本功,在有序链表中删除重复元素II
本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是LeetCode专题的第51篇文章,我们来看LeetCode第82题,删除有序链表中的重复元素II(Remove Duplicates ...
- leetcode 83. 删除排序链表中的重复元素 及 82. 删除排序链表中的重复元素 II
83. 删除排序链表中的重复元素 问题描述 给定一个排序链表,删除所有重复的元素,使得每个元素只出现一次. 示例 1: 输入: 1->1->2 输出: 1->2 示例 2: 输入: ...
- 力扣 ——Remove Duplicates from Sorted List II(删除排序链表中的重复元素 II)python实现
题目描述: 中文: 给定一个排序链表,删除所有含有重复数字的节点,只保留原始链表中 没有重复出现 的数字. 示例 1: 输入: 1->2->3->3->4->4-> ...
- 力扣(LeetCode)删除排序链表中的重复元素II 个人题解
给定一个排序链表,删除所有含有重复数字的节点,只保留原始链表中 没有重复出现 的数字. 思路和上一题类似(参考 力扣(LeetCode)删除排序链表中的重复元素 个人题解)) 只不过这里需要用到一个前 ...
随机推荐
- 基于stm32的spi接口dma 数据收发实例解析
一 前记 SPI接口平时用的比较少,再加上对CUBEMX不是很熟悉,这里踩了不少坑才把问题解决.针对遇到了不少问题,是要值得梳理一下了. 二 源码解析 1 SPI的DMA发送端配置: 2 主函数源码: ...
- 应用层01-HTTP
2.1 应用层协议原理 2.1.1 网络应用程序体系结构 研发网络应用的程序的核心是写出能够运行在不同的端系统和通过网络彼此通信的程序. 例如: Web应用程序 客户:浏览器程序(进程) 服务:Web ...
- getClass()方法----getName()方法
public class Test { public static void main(String[] args) { Person p = new Person(1,"刘德华" ...
- 记录--Js基础练习题目
这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 1.使用js,在页面中打印以下图案 提示: document.write可以在页面中打印内容<br>在html中代表换行, 在 ...
- dbvisivuser连oracle数据库报错没有权限
原因:数据库从11g升级为19c了 解决:ojdbc.jar也要换成最新的,导致报错的旧jar包2M大小,换成新jar包3M大小.替换jar包要将 dbvisivuser的tool driverMan ...
- [SQL]SQL注入与SQL执行过程(基于JDBC)
[版权声明]未经博主同意,谢绝转载!(请尊重原创,博主保留追究权) https://www.cnblogs.com/cnb-yuchen/p/17955065 出自[进步*于辰的博客] 参考笔记一,P ...
- 百度文库内容复制 C# webbrowser+Nsoup
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...
- KingbaseES V8R6 集群运维案例 -- 自动故障转移失败处理
KingbaseES V8R6版本 数据库自动故障转移失败(Automatic Database Failover Fails) 适用于: KingbaseES V8R6 版本. repmgr配置信息 ...
- FFmpeg开发笔记(九)Linux交叉编译Android的x265库
<FFmpeg开发实战:从零基础到短视频上线>一书的"12.1.2 交叉编译Android需要的so库"介绍了如何在Windows环境交叉编译Android所需FF ...
- SQLite数据库(来自菜鸟教程)
SQLite是什么?为什么要用SQLite?SQLite有什么特点? 答:下面请听小猪娓娓道来: ①SQLite是一个轻量级的关系型数据库,运算速度快,占用资源少,很适合在移动设备上使用, 不仅支持标 ...