LeetCode 热题 100_寻找重复数(100_287_中等_C++)(技巧)(暴力解法;哈希集合;二分查找)

news2025/5/18 9:26:59

LeetCode 热题 100_寻找重复数(100_287_中等_C++)

    • 题目描述:
    • 输入输出样例:
    • 题解:
      • 解题思路:
        • 思路一(暴力解法):
        • 思路二(哈希集合):
        • 思路三(二分查找):
      • 代码实现
        • 代码实现(思路一(暴力解法)):
        • 代码实现(思路二(哈希集合)):
        • 代码实现(思路三(二分查找)):
        • 以思路二为例进行调试

题目描述:

给定一个包含 n + 1 个整数的数组 nums ,其数字都在 [1, n] 范围内(包括 1 和 n),可知至少存在一个重复的整数。

假设 nums 只有 一个重复的整数 ,返回 这个重复的数

你设计的解决方案必须 不修改 数组 nums 且只用常量级 O(1) 的额外空间。

输入输出样例:

示例 1:
输入:nums = [1,3,4,2,2]
输出:2

示例 2:
输入:nums = [3,1,3,4,2]
输出:3

示例 3:
输入:nums = [3,3,3,3,3]
输出:3

提示:
1 <= n <= 104
nums.length == n + 1
1 <= nums[i] <= n
nums 中 只有一个整数 出现 两次或多次 ,其余整数均只出现 一次

题解:

解题思路:

思路一(暴力解法):

1、双重循环,进行枚举。

2、复杂度分析:
① 时间复杂度:O(n2),n 代表数组中元素的个数,使用了双重循环。
② 空间复杂度:空间复杂度是 O(1)。

思路二(哈希集合):

1、使用哈希集合来存储每个数字,若当前元素之前已经存在一个相同的值在哈希集合中,则当前元素为重复元素。

2、复杂度分析
① 时间复杂度:O(n),n 代表数组中元素的个数,遍历一遍数组。
② 空间复杂度:O(n),n 代表数组中元素的个数,使用哈希集合来存储元素。

思路三(二分查找):

1、已知数字的范围为 [1 , n ] ,总共有 n + 1 个整数 且 nums 只有 一个重复的整数。则肯定存在 [1,2,…,n] 其中一个元素重复,则可采用二分查找。

  • 假设有三个物品放两个抽屉那么必定有一个抽屉有两个物品
  • 运用这个原理我们可以运用到此问题,若nums={1,3,4,2,2} 。n=4
  • 假设我们统计 小于等于 2 元素的个数等于 3,3 个数放 1,2 两个位置必定有一个重复元素
  • 那重复元素一定是 1 或者 2,那我们再查看 小于等于 1 元素的个数等于 1 则正好不重复,则重复元素必定是 2 。

2、复杂度分析
① 时间复杂度:O(nlogn),其中 n 为 nums 数组的长度,采用了二分查找。

② 空间复杂度:O(1)。

代码实现

代码实现(思路一(暴力解法)):
class Solution1 {
public:
    // 定义函数 findDuplicate,接收一个整数数组 nums,返回数组中第一个重复的元素
    int findDuplicate(vector<int> &nums) {
        // 外层循环:遍历数组 nums 中的每个元素
        for (int l = 0; l < nums.size(); l++) {
            // 内层循环:从当前元素的下一个位置开始遍历
            // 目的是比较 nums[l] 与 nums[r] 是否相等
            for (int r = l + 1; r < nums.size(); r++) {
                // 如果找到重复的元素,返回该元素
                if (nums[l] == nums[r]) {
                    return nums[l];  // 返回第一个重复的元素
                }
            }
        }
        
        // 如果没有找到重复元素,返回 0
        return -1;
    }
};
代码实现(思路二(哈希集合)):
class Solution2 {
public:
    // 定义函数 findDuplicate,接收一个整数数组 nums,返回数组中第一个重复的元素
    int findDuplicate(vector<int> &nums) {
        unordered_set<int> mp_set;
        for(auto &i:nums){
            if (mp_set.count(i)){
                return i;
            }
            mp_set.insert(i);
        }
        return -1;
    }
};
代码实现(思路三(二分查找)):
class Solution3 {
public:
    // findDuplicate 函数:用来查找给定数组中的重复数字
    int findDuplicate(vector<int> &nums) {
        int len = nums.size();  // 获取数组的长度

        int left = 1;  // 左指针设为 1,因为数组元素范围从 1 到 n
        int right = nums.size() - 1;  // 右指针设为 n-1,因为数组索引从 0 开始,元素值最大为 n

        // 使用二分查找的思想,判断重复数字的位置
        while (left < right) {
            // 计算中间值
            int mid = (left + right) / 2;

            // 统计数组中小于等于 mid 的元素个数
            int count = 0;
            for (auto &i : nums) {
                if (i <= mid) {
                    count++;  // 如果元素小于等于 mid,就增加计数
                }
            }

            // 如果小于等于 mid 的元素个数大于 mid,则说明重复的数字在左半部分
            if (count > mid) {
                right = mid;  // 将右指针移到 mid,继续在左半部分查找
            } else {
                left = mid + 1;  // 否则,重复的数字在右半部分,将左指针移到 mid + 1
            }
        }

        // 当 left == right 时,找到重复的数字
        return left;
    }
};
以思路二为例进行调试
#include<iostream>
#include<vector>
#include<unordered_set>
using namespace std;

class Solution2 {
public:
    // 定义函数 findDuplicate,接收一个整数数组 nums,返回数组中第一个重复的元素
    int findDuplicate(vector<int> &nums) {
        unordered_set<int> mp_set;
        for(auto &i:nums){
            if (mp_set.count(i)){
                return i;
            }
            mp_set.insert(i);
        }
        return -1;
    }
};

int main(int argc, char const *argv[])
{
    vector<int> nums={3,1,3,4,2};
    Solution2 s;
    cout<<s.findDuplicate(nums);
    return 0;
}

LeetCode 热题 100_寻找重复数(100_287)原题链接
欢迎大家和我沟通交流(✿◠‿◠)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2378407.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

NBA足球赛事直播源码体育直播M33模板赛事源码

源码名称&#xff1a;体育直播赛事扁平自适应M33直播模板源码 开发环境&#xff1a;帝国cms7.5 空间支持&#xff1a;phpmysql 带软件采集&#xff0c;可以挂着自动采集发布&#xff0c;无需人工操作&#xff01; 演示地址&#xff1a;NBA足球赛事直播源码体育直播M33模板赛事…

电子电器架构 --- 整车造车阶段四个重要节点

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 钝感力的“钝”,不是木讷、迟钝,而是直面困境的韧劲和耐力,是面对外界噪音的通透淡然。 生活中有两种人,一种人格外在意别人的眼光;另一种人无论…

黑马点评-用户登录

文章目录 用户登录发送短信验证码注册/登录校验登录 用户登录 发送短信验证码 public Result sendCode(String phone, HttpSession session) {// 1.校验手机号if (RegexUtils.isPhoneInvalid(phone)) {// 2.如果不符合&#xff0c;返回错误信息return Result.fail("手机…

十二、Hive 函数

作者&#xff1a;IvanCodes 日期&#xff1a;2025年5月1日 专栏&#xff1a;Hive教程 在数据处理的广阔天地中&#xff0c;我们常常需要对数据进行转换、计算、清洗或提取特定信息。Hive 提供了强大的内置运算符和丰富的内置函数库&#xff0c;它们就像魔法师手中的魔法棒&…

No More Adam: 新型优化器SGD_SaI

一.核心思想和创新点 2024年12月提出的SGD-SaI算法&#xff08;Stochastic Gradient Descent with Scaling at Initialization&#xff09;本质上是一种在训练初始阶段对不同参数块&#xff08;parameter block&#xff09;基于**梯度信噪比&#xff08;g-SNR, Gradient Signa…

JSP链接MySQL8.0(Eclipse+Tomcat9.0+MySQL8.0)

所用环境 Eclipse Tomcat9.0 MySQL8.0.21(下载&#xff1a;MySQL Community Server 8.0.21 官方镜像源下载 | Renwole&#xff09; mysql-connector-java-8.0.21&#xff08;下载&#xff1a;MySQL :: Begin Your Download&#xff09; .NET Framework 4.5.2&#xff08;下…

SEO长尾词与关键词优化实战

内容概要 在SEO优化体系中&#xff0c;长尾关键词与核心关键词的协同作用直接影响流量获取效率与用户转化路径。长尾词通常由3-5个词组构成&#xff0c;搜索量较低但意图明确&#xff0c;能精准触达细分需求用户&#xff1b;核心关键词则具备高搜索量与广泛覆盖能力&#xff0…

机器学习-人与机器生数据的区分模型测试-数据处理1

附件为训练数据&#xff0c;总体的流程可以作为参考。 导入依赖 import pandas as pd import os import numpy as np from sklearn.model_selection import train_test_split,GridSearchCV from sklearn.ensemble import RandomForestClassifier,VotingClassifier from skle…

HelloWorld

HelloWorld 新建一个java文件 文件后缀名为 .javahello.java【注意】系统可能没有显示文件后缀名&#xff0c;我们需要手动打开 编写代码 public class hello {public static void main(String[] args) {System.out.print(Hello,World)} }编译 javac java文件&#xff0c;会生…

SEO 优化实战:ZKmall模板商城的 B2C商城的 URL 重构与结构化数据

在搜索引擎算法日益复杂的今天&#xff0c;B2C商城想要在海量信息中脱颖而出&#xff0c;仅靠优质商品和营销活动远远不够。ZKmall模板商城以实战为导向&#xff0c;通过URL 重构与结构化数据优化两大核心策略&#xff0c;帮助 B2C 商城实现从底层架构到搜索展示的全面升级&…

数字万用表与指针万用表使用方法及注意事项

在电子测量领域&#xff0c;万用表是极为常用的工具&#xff0c;数字万用表和指针万用表各具特点。熟练掌握它们的使用方法与注意事项&#xff0c;能确保测量的准确性与安全性。下面为您详细介绍&#xff1a; 一 、数字万用表按钮功能 > 进入及退出手动量程模式 每 按 […

【读代码】端到端多模态语言模型Ultravox深度解析

一、项目基本介绍 Ultravox是由Fixie AI团队开发的开源多模态大语言模型,专注于实现音频-文本的端到端实时交互。项目基于Llama 3、Mistral等开源模型,通过创新的跨模态投影架构,绕过了传统语音识别(ASR)的中间步骤,可直接将音频特征映射到语言模型的高维空间。 核心优…

RabbitMQ工作流程及使用方法

一、什么是RabbitMQ RabbitMQ 是一款基于 ‌AMQP&#xff08;高级&#xff0c;消息队列协议&#xff09;‌ 的开源消息中间件&#xff0c;专为分布式系统设计&#xff0c;用于实现应用程序间的异步通信&#xff0c;其核心功能是通过 ‌消息代理&#xff08;Message Broker&…

算法:分治法

实验内容 在一个2kⅹ2k个方格组成的棋盘中&#xff0c;若恰有一个方格与其他方格不同&#xff0c;则称该方格为特殊方格&#xff0c;且称该棋盘为一特殊棋盘。 显然&#xff0c;特殊方格出现的位置有4k 种情况&#xff0c;即k>0,有4k 种不同的特殊棋盘 棋盘覆盖&#xff1a…

MySQL初阶:sql事务和索引

索引&#xff08;index&#xff09; 可以类似理解为一本书的目录&#xff0c;一个表可以有多个索引。 索引的意义和代价 在MySQL中使用select进行查询时会经过&#xff1a; 1.先遍历表 2.将条件带入每行记录中进行判断&#xff0c;看是否符合 3.不符合就跳过 但当表中的…

docker部署第一个Go项目

1.前期准备 目录结构 main.go package mainimport ("fmt""github.com/gin-gonic/gin""net/http" )func main() {fmt.Println("\n .::::.\n .::::::::.\n :::::::::::\n …

Visual Studio2022跨平台Avalonia开发搭建

由于我已经下载并安装了 VS2022版本&#xff0c;这里就跳过不做阐述。 1.安装 Visual Studio 2022 安装时工作负荷Tab页勾选 ‌“.NET 桌面开发”‌ 和“Visual Studio扩展开发”‌ &#xff0c;这里由于不是用的微软的MAUI&#xff0c;所以不用选择其他的来支持跨平台开发&a…

css iconfont图标样式修改,js 点击后更改样式

背景&#xff1a; 在vue项目中&#xff0c;通过点击/鼠标覆盖&#xff0c;更改选中元素的样式&#xff0c;可以通过js逻辑&#xff0c;也可以根据css样式修改。包括以下内容&#xff1a;iconfont图标的引入以及使用&#xff0c;iconfont图标样式修改【导入文件是纯白&#xff0…

开源项目实战学习之YOLO11:12.4 ultralytics-models-sam-memory_attention.py源码分析

👉 点击关注不迷路 👉 点击关注不迷路 👉 另外,前些天发现了一个巨牛的AI人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。感兴趣的可以点击相关跳转链接。 点击跳转到网站。 ultralytics-models-sam 1.sam-modules-memory_attention.pyblocks.py: 定义模…

【沉浸式求职学习day42】【算法题:滑动窗口】

沉浸式求职学习 长度最小的子数组水果成篮 关于算法题&#xff1a;滑动窗口的几个题目 长度最小的子数组 给定一个含有 n 个正整数的数组和一个正整数 s &#xff0c;找出该数组中满足其和 ≥ s 的长度最小的 连续 子数组&#xff0c;并返回其长度。如果不存在符合条件的子数组…