当前位置: 首页 > news >正文

LeetCode 面试经典 150_哈希表_存在重复元素 II(46_219_C++_简单)

LeetCode 面试经典 150_哈希表_存在重复元素 II(46_219_C++_简单)

    • 题目描述:
    • 输入输出样例:
    • 题解:
      • 解题思路:
        • 思路一(哈希表):
        • 思路二(滑动窗口):
      • 代码实现
        • 代码实现(思路一(哈希表)):
        • 代码实现(思路二(滑动窗口)):
        • 以思路二为例进行调试

题目描述:

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

题解:

解题思路:

思路一(哈希表):

1、查找相同元素可以想到使用哈希表,key: nums[i] ; value:i。

  • 当前元素不存在哈希表中,将元素与对应下标存入哈希表中。
  • 当前元素存在哈希表中,判断当前元素的下标 和 之前哈希表中存储元素的下标,如果满足 abs(i - j) <= k 则返回true,若不满足如果满足 abs(i - j) <= k ,则更新哈希表中此元素的对应关系为当前位置。
  • 若遍历整个数组没有满足abs(i - j) <= k的值则返回false

2、复杂度分析:
① 时间复杂度:O(n),n 为数组中元素的个数,只遍历了一遍数组。
② 空间复杂度:O(n),最坏的情况下存储整个数组中的元素。

思路二(滑动窗口):

1、left为窗口的左侧,right为窗口的右侧。因right-left <= k 可以自然的想到维护一个 k+1 大小的 滑动窗口, 那么riht - left = k 时(也就是窗口大小为k-1)。left 先右移,right再右移(注意left和right总是右移)

2、复杂度分析
① 时间复杂度:O(n),n 为数组中元素的个数,只遍历了一遍数组。
② 空间复杂度:O(k),最坏只存储 k-1 个元素。

代码实现

代码实现(思路一(哈希表)):
class Solution1 {
public:bool containsNearbyDuplicate(vector<int>& nums, int k) {// 使用 unordered_map 来存储数组元素及其对应的索引unordered_map<int, int> mp;// 遍历数组for (int i = 0; i < nums.size(); i++) {// 检查当前元素是否已存在于 map 中,并且判断当前索引与该元素最后出现的索引之差是否小于等于 kif (mp.count(nums[i]) && i - mp[nums[i]] <= k) {// 如果满足条件,说明找到了相同元素且它们的索引之差小于等于 k,返回 truereturn true;}// 将当前元素及其索引加入 mapmp[nums[i]] = i;}// 如果遍历完成没有找到符合条件的元素,返回 falsereturn false;}
};
代码实现(思路二(滑动窗口)):
class Solution2 {
public:bool containsNearbyDuplicate(vector<int>& nums, int k) {// 使用 unordered_set 来存储当前窗口中的元素unordered_set<int> set;// 初始化两个指针,left 和 right,表示滑动窗口的左右边界int left = 0;int right = 0;// 使用 while 循环遍历整个数组,right 指针从左到右扩展while (right < nums.size()) {// 如果当前元素在窗口中已经存在,则返回 true,表示找到了重复元素if (set.count(nums[right])) {return true;}// 将当前元素添加到窗口集合中set.insert(nums[right]);// 如果窗口的大小大于等于 k,则移动 left 指针,缩小窗口while (right - left >= k) {// 移除窗口最左边的元素set.erase(nums[left]);// 左指针向右移动,缩小窗口++left;}// 右指针向右移动,扩大窗口++right;}// 如果遍历完整个数组,仍然没有找到符合条件的重复元素,返回 falsereturn false;}
};
/** 滑动窗口,和上方代码是相同的思想* 当窗口大小固定时我们可以使用if来控制left的增加,for循环来控制right的增加*/
class Solution3 {
public:bool containsNearbyDuplicate(vector<int>& nums, int k) {// 使用 unordered_set 来存储当前窗口中的元素unordered_set<int> set;// 初始化左指针 left,表示滑动窗口的左边界int left = 0;// 使用 for 循环遍历整个数组,right 指针从左到右扩展for (int right = 0; right < nums.size(); right++) {// 如果当前元素 nums[right] 在窗口中已经存在,则返回 true,表示找到了重复元素if (set.count(nums[right])) {return true;}// 将当前元素 nums[right] 插入到滑动窗口集合中set.insert(nums[right]);// 如果当前窗口的大小已经达到或超过 k,移动 left 指针,缩小窗口if (right - left >= k) {// 移除窗口最左侧的元素 nums[left],缩小窗口set.erase(nums[left]);// 左指针向右移动,缩小窗口left++;}}// 如果遍历完整个数组,仍然没有找到符合条件的重复元素,返回 falsereturn false;}
};
以思路二为例进行调试
#include<iostream>
#include<vector>
#include<unordered_map>
#include<unordered_set>
using namespace std;class Solution2 {
public:bool containsNearbyDuplicate(vector<int>& nums, int k) {// 使用 unordered_set 来存储当前窗口中的元素unordered_set<int> set;// 初始化两个指针,left 和 right,表示滑动窗口的左右边界int left = 0;int right = 0;// 使用 while 循环遍历整个数组,right 指针从左到右扩展while (right < nums.size()) {// 如果当前元素在窗口中已经存在,则返回 true,表示找到了重复元素if (set.count(nums[right])) {return true;}// 将当前元素添加到窗口集合中set.insert(nums[right]);// 如果窗口的大小大于等于 k,则移动 left 指针,缩小窗口while (right - left >= k) {// 移除窗口最左边的元素set.erase(nums[left]);// 左指针向右移动,缩小窗口++left;}// 右指针向右移动,扩大窗口++right;}// 如果遍历完整个数组,仍然没有找到符合条件的重复元素,返回 falsereturn false;}
};int main(int argc, char const *argv[])
{vector<int> nums={1,2,3,1};int k=3;Solution2 s;if (s.containsNearbyDuplicate(nums,3)){cout<<"true"<<endl;}else{cout<<"false"<<endl;}return 0;
}

LeetCode 面试经典 150_哈希表_存在重复元素 II(46_219)原题链接
欢迎大家和我沟通交流(✿◠‿◠)

http://www.dtcms.com/a/461689.html

相关文章:

  • 网站2个页面做首页广元 网站建设
  • HTML应用指南:利用POST请求获取全国中信银行网点位置信息
  • 加油站小程序上线即闲置?3 大核心功能 + 运营落地策略
  • 做淘宝客导购网站宁夏百度公司
  • 使用 Flask 实现本机 PyTorch 模型部署:从服务端搭建到客户端调用
  • sql题目练习——多表查询
  • c 做网站加载多个图片网站开发实战第二章
  • 精通C语言(3. 自定义类型:联合体和枚举)
  • 认知事物的三个层次
  • 做数学题目在哪个网站好设计好的装修公司
  • 09.Linux环境变量
  • 11、规划过程组(4):风险
  • HT8698 立体声 D 类音频功率放大器:性能参数介绍
  • 做亚克力在那个网站上好上海建工一建集团有限公司
  • DOM与BOM核心用法解析
  • 如何在网站上做跳转代码最好的科技资讯网站
  • 【项目】自然语言处理——情感分析 <下>
  • 网站页面制作公司外部网站 同意加载
  • 高通平台WiFi学习--IPv6 邻居发现卸载:Wi-Fi 固件助力移动设备功耗优化
  • 网站备案 工信部如何做建材团购网站
  • 知名的咨询行业网站制作茂名网站开发
  • 网络管理部分
  • 小白逆袭----2025了,彻底弄懂react-test单元测试 基础使用(一)
  • 代做标书网站政务网站建设模块
  • (2)100天python从入门到拿捏
  • 我的云函数向 unicloud 数据库存储数据问什么 grade 字段无法存储?
  • 免费下载代码的网站做网站国外网站
  • npm install --legacy-peer-deps:它到底做了什么,什么时候该用?
  • [Tongyi] 工具集成 | run_react_infer
  • 做课题查新网站茶叶网站开发目的和意义