Leetcode 每日一题 219.存在重复元素 II

ops/2024/12/12 8:34:37/

目录

问题描述

输入输出格式

示例

算法分析

过题图片

代码实现

复杂度分析

题目链接

总结


问题描述

给定一个整数数组nums和一个整数k,我们需要判断数组中是否存在两个不同的索引ij,使得nums[i] == nums[j]|i - j| <= k。如果存在这样的ij,返回true;否则,返回false

输入输出格式

  • 输入:一个整数数组nums和一个整数k
  • 输出:一个布尔值,表示是否存在满足条件的ij

示例

  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

算法分析

这个问题可以通过使用哈希表来解决。我们需要跟踪最近k个元素,检查是否有任何重复的元素出现。以下是解决这个问题的步骤:

  1. 创建一个HashSet来存储最近k个元素。
  2. 遍历数组nums,对于每个元素:
    • 检查该元素是否已经在HashSet中。如果是,返回true
    • 将当前元素添加到HashSet中。
    • 如果HashSet的大小超过了k,从HashSet中移除最老的元素(即在i - k位置的元素)。
  3. 如果遍历结束后没有找到重复元素,返回false

过题图片

代码实现

 

java

class Solution {public boolean containsNearbyDuplicate(int[] nums, int k) {HashSet<Integer> set = new HashSet<>();for(int i = 0; i < nums.length; i++) {if(set.contains(nums[i])) {return true;}set.add(nums[i]);if(set.size() > k) {set.remove(nums[i - k]);}}return false;}
}

C++

class Solution {
public:bool containsNearbyDuplicate(vector<int>& nums, int k) {unordered_set<int>set;for(int i=0;i<nums.size();++i){if(set.count(nums[i])){return true;}set.emplace(nums[i]);if(set.size()>k){set.erase(nums[i-k]);}}return false;}
};

复杂度分析

  • 时间复杂度:O(n),其中n是数组nums的长度。我们只需要遍历一次数组。
  • 空间复杂度:O(min(n, k)),在最坏的情况下,我们需要存储所有元素,但在大多数情况下,我们只需要存储最近k个元素。

题目链接

219. 存在重复元素 II - 力扣(LeetCode)

总结

这个问题是一个典型的使用哈希表解决的问题,它考察了我们对哈希表操作的理解和应用。通过维护一个滑动窗口内的元素集合,我们可以有效地检查是否存在满足条件的重复元素。这种方法简洁且高效,是解决这类问题的首选方法。此外可以通过这道题看一下其他应用

哈希表的应用

哈希表(或称为散列表)是一种通过键值对存储数据的数据结构,它能够提供快速的查找、插入和删除操作。在这个问题中,哈希表的使用展示了其在处理数组和集合问题中的强大能力。通过将元素的值作为键,我们可以在常数时间内检查元素是否已经存在于哈希表中,从而避免了复杂的遍历和比较操作。

滑动窗口技术

滑动窗口是一种处理数组子区间问题的有效技术。在这个问题中,我们维护了一个大小为k的窗口,随着数组的遍历,窗口内的元素集合也在不断更新。这种技术允许我们只关注数组中与当前元素距离不超过k的元素,从而简化了问题。

时间和空间效率

我们的方法具有线性时间复杂度O(n),其中n是数组的长度。这是因为我们只需要遍历一次数组,并且在哈希表中进行的操作(插入、删除和查找)都是常数时间的。空间复杂度为O(min(n, k)),这是因为在最坏的情况下,我们可能需要存储所有元素,但在大多数情况下,我们只需要存储最近k个元素。

代码实现的简洁性

我们的代码实现简单而直观,易于理解和实现。这种方法不仅减少了代码的复杂性,也降低了出错的可能性。通过将逻辑封装在一个循环中,我们避免了复杂的条件判断和多个循环的嵌套。

算法的适用性

这种方法不仅适用于本问题,还可以推广到其他需要检测数组中重复元素的场景,特别是那些涉及到元素之间距离限制的问题。例如,它可以用于检测一个数组中是否存在两个元素,它们的差值不超过某个给定的阈值。

算法的局限性

尽管这种方法在大多数情况下都非常有效,但它也有局限性。例如,如果数组中的元素数量远远大于k,那么维护一个固定大小的窗口可能不是最优的选择。此外,如果数组中的元素值范围非常大,哈希表可能会消耗大量的内存。


http://www.ppmy.cn/ops/141205.html

相关文章

大语言模型(2)--GPT-1

GPT-1是由OpenAI在2018年推出的第一代生成式预训练模型&#xff08;《Improving Language Understanding by Generative Pre-Training》&#xff09;&#xff0c;它采用了无监督预训练和有监督微调相结合的方法&#xff0c;以增强模型的通用任务求解能力。在此之前&#xff0c;…

CMake笔记之ros的catkin_make中add_dependencies用法对比:单一目标依赖 vs 多目标依赖

CMake笔记之ros的catkin_make中add_dependencies用法对比&#xff1a;单一目标依赖 vs 多目标依赖 add_dependencies(publisher custom_msgs_pkg_generate_messages_cpp)## 添加依赖&#xff0c;确保消息头文件生成后再编译 add_dependencies(publisher ${${PROJECT_NAME}_EXPO…

PostgreSQL的学习心得和知识总结(一百六十三)|深入理解PostgreSQL数据库之 GUC参数compute_query_id 的使用和实现

目录结构 注&#xff1a;提前言明 本文借鉴了以下博主、书籍或网站的内容&#xff0c;其列表如下&#xff1a; 1、参考书籍&#xff1a;《PostgreSQL数据库内核分析》 2、参考书籍&#xff1a;《数据库事务处理的艺术&#xff1a;事务管理与并发控制》 3、PostgreSQL数据库仓库…

分区【东北大学oj数据结构6-2】C语言

快速排序基于分而治之的方法。 在 QuickSort(A, p, r) 中&#xff0c;首先&#xff0c;过程 Partition(A, p, r) 将数组 A[p..r] 分成两个子数组 A[p..q-1] 和 A[q1 ..r] 使得 A[p..q-1] 的每个元素都小于或等于A[q]&#xff0c;反过来&#xff0c;A[q1..r]的每个元素都大于或等…

人工智能:重塑人类生活的力量

随着科技的飞速发展&#xff0c;人工智能&#xff08;Artificial Intelligence, AI&#xff09;逐渐从科幻小说走进现实&#xff0c;成为推动社会变革的关键力量。从智能家居到自动驾驶&#xff0c;从医疗健康到金融服务&#xff0c;AI的应用几乎触及到了生活的每一个角落&…

C语言:指针详解续

一、字符指针变量 我们知道有种指针类型为字符指针(char*)。 #include <stdio.h> int main() {char ch w;char* pch &ch;printf("%c\n", *pch);return 0; } 其实它还有一种使用方式。 #include <stdio.h> int main() {char* pstr "hello…

node(multer)上传文件

node(multer)上传文件 from表单上传文件 前端代码 import React from react; import { Form, Button, Upload, message } from antd; import { UploadOutlined } from ant-design/icons; import axios from axios;const FileUploadForm () > {const onFinish async (va…

JDK HTTP 服务器:真实世界后端开源演示

JDK HTTP Server代码库包含真实的世界的示例&#xff08;CRUD&#xff0c;auth&#xff0c;高级模式等&#xff09;&#xff0c; 创建此代码库是为了演示使用JDK HTTP Server构建的完全成熟的全栈应用程序&#xff0c;包括CRUD操作&#xff0c;身份验证&#xff0c;路由&#…