存在重复元素 II[简单]

news/2024/10/28 22:35:44/

优质博文:IT-BLOG-CN

一、题目

给你一个整数数组nums和一个整数k,判断数组中是否存在两个不同的索引ij,满足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

二、代码

【1】滑动窗口: 数组nums中的每个长度不超过k + 1的滑动窗口,同一个滑动窗口中的任意两个下标差的绝对值不超过k。如果存在一个滑动窗口,其中有重复元素,则存在两个不同的下标ij满足nums[i] = nums[j]∣i−j∣ ≤ k。如果所有滑动窗口中都没有重复元素,则不存在符合要求的下标。因此,只要遍历每个滑动窗口,判断滑动窗口中是否有重复元素即可。

如果一个滑动窗口的结束下标是i,则该滑动窗口的开始下标是max⁡(0,i−k)。可以使用哈希集合存储滑动窗口中的元素。从左到右遍历数组nums,当遍历到下标i时,具体操作如下:
1、如果i > k,则下标i − k − 1处的元素被移出滑动窗口,因此将nums[i−k−1]从哈希集合中删除;
2、判断nums[i]是否在哈希集合中,如果在哈希集合中则在同一个滑动窗口中有重复元素,返回true,如果不在哈希集合中则将其加入哈希集合。
当遍历结束时,如果所有滑动窗口中都没有重复元素,返回false

class Solution {public boolean containsNearbyDuplicate(int[] nums, int k) {// 思想,采用滑动窗口的思想,定义两个指针,之间的最大距离为k,如果超过k,则进行下一次判断,慢指针向前一步;if (nums != null && nums.length == 0) {return false;}for (int i = 0; i < nums.length; i++) {for (int j = i + 1; (j <= i + k && j < nums.length); j++) {if (nums[i] == nums[j]) {return true;}}}return false;}
}

时间复杂度: O(n)其中n是数组nums的长度。需要遍历数组一次,对于每个元素,哈希集合的操作时间都是O(1)
空间复杂度: O(k)其中k是判断重复元素时允许的下标差的绝对值的最大值。需要使用哈希集合存储滑动窗口中的元素,任意时刻滑动窗口中的元素个数最多为k+1个。

【2】哈希表: 从左到右遍历数组nums,当遍历到下标i时,如果存在下标j<i使得nums[i]=nums[j],则当i−j≤k时即找到了两个符合要求的下标ji。如果在下标i之前存在多个元素都和nums[i]相等,为了判断是否存在满足nums[i]=nums[j]i−j≤k的下标j,应该在这些元素中寻找下标最大的元素,将最大下标记为j,判断i−j≤k是否成立。

如果i−j≤k,则找到了两个符合要求的下标ji;如果i−j>k,则在下标i之前不存在任何元素满足与nums[i]相等且下标差的绝对值不超过k,当遍历到下标i时,如果在下标i之前存在与nums[i]相等的元素,应该在这些元素中寻找最大的下标j,判断i−j≤k是否成立。

可以使用哈希表记录每个元素的最大下标。从左到右遍历数组nums,当遍历到下标i时,进行如下操作:
1、如果哈希表中已经存在和nums[i]相等的元素且该元素在哈希表中记录的下标j满足i−j≤k,返回true
2、将nums[i]和下标i存入哈希表,此时inums[i]的最大下标。
上述两步操作的顺序不能改变,因为当遍历到下标i时,只能在下标i之前的元素中寻找与当前元素相等的元素及该元素的最大下标。当遍历结束时,如果没有遇到两个相等元素的下标差的绝对值不超过k,返回false

class Solution {public boolean containsNearbyDuplicate(int[] nums, int k) {// 思想:通过hashmap[key=nums中的元素,value = 下表],每次判断元素是否存在,存在则获取下表与当前的元素进行比较;if (nums != null && nums.length == 0) {return false;}Map<Integer, Integer> map = new HashMap<>();for (int i = 0; i < nums.length; i++) {if (map.containsKey(nums[i]) && i - map.get(nums[i]) <= k) {return true;}map.put(nums[i], i);} return false;}
}

时间复杂度: O(n),其中n是数组nums的长度。需要遍历数组一次,对于每个元素,哈希表的操作时间都是O(1)
空间复杂度: O(n),其中n是数组nums的长度。需要使用哈希表记录每个元素的最大下标,哈希表中的元素个数不会超过n


http://www.ppmy.cn/news/1201504.html

相关文章

了解web3,什么是web3

Web3是指下一代互联网&#xff0c;它基于区块链技术&#xff0c;将各种在线活动更加安全、透明和去中心化。Web3是一个广义的概念&#xff0c;它包括了很多方面&#xff0c;如数字货币、去中心化应用、智能合约等等。听不懂且大多数人听到这个东西&#xff0c;直觉感觉就像骗子…

React实现一个拖拽排序组件 - 支持多行多列、支持TypeScript、支持Flip动画、可自定义拖拽区域

一、效果展示 排序&#xff1a; 丝滑的Flip动画 自定义列数 &#xff08;并且宽度会随着屏幕宽度自适应&#xff09; 自定义拖拽区域&#xff1a;&#xff08;扩展性高&#xff0c;可以全部可拖拽、自定义拖拽图标&#xff09; 二、主要思路 Tip&#xff1a; 本代码的CSS使用…

ceval 数据集明文位置编码嵌入

明文位置编码嵌入 数据集地址嵌入代码解释说明数据集地址 ceval 数据集 嵌入代码 import pandas as pd from glob import glob from tqdm import tqdm# 训练集数据处理 voc = set() one_data_list = []

vue3错误排查-POST请求的body参数 传参方式form-data和json

问题&#xff1a;vue3实现登录功能&#xff0c;登录成功后 跳转到登陆后的界面 一秒后 闪退回登录页 对应的输出结果也一闪而过&#xff0c;反复复查了代码&#xff0c;没问题。 自测&#xff1a;进行断点输出调试。强行跳转到登陆后的界面&#xff0c;查看输出的结果。 没有报…

Vue 跨域的两种解决方式

一、通过 proxy 解决跨域 1.1 baseURL 配置 对 axios 二次封装时&#xff0c;baseURL 设置为 /api。 const serviceAxios axios.create({baseURL: /api,timeout: 10000, // 请求超时设置withCredentials: false, // 跨域请求是否需要携带 cookie });1.2 vue.config.js 配置…

语音识别接口试用

语音识别结果对比 1.jonatasgrosman/wav2vec2-large-xlsr-53-chinese-zh-cn 啊五包你没有什么问题嗓局问的这老受刚来指伯间我想就了解其二联地完觉全没问题犹该奖姐家女标要等到老师主动据奖定练择因位我主要奖的是耶号联接最长加展们如果说宁士比到六点级到一到另年级的家长…

本地部署 CogVLM

本地部署 CogVLM CogVLM 是什么CogVLM Github 地址部署 CogVLM启动 CogVLM CogVLM 是什么 CogVLM 是一个强大的开源视觉语言模型&#xff08;VLM&#xff09;。CogVLM-17B 拥有 100 亿视觉参数和 70 亿语言参数。 CogVLM-17B 在 10 个经典跨模态基准测试上取得了 SOTA 性能&am…

互联网摸鱼日报(2023-11-06)

互联网摸鱼日报(2023-11-06) 36氪新闻 本周双碳大事&#xff1a;阳光电源获全球储能系统出货第一名&#xff1b;隆基绿能等公司发布三季报&#xff1b;前三季度全国可再生能源新增装机同比增93% 北交所周报&#xff1a;首只北证50指数增强基金正式运作&#xff1b;下周泰鹏智…