【第0006页 · 数组】寻找重复数

news2024/9/20 14:47:09

【前言】本文以及之后的一些题解都会陆续整理到目录中,若想了解全部题解整理,请看这里:

第0006页 · 寻找重复数

        今天想讨论的一道题在 LeetCode 上评论也是颇为“不错”。有一说一,是道好题,不过我们还是得先理解了它才算真正的好题。这里我们展示一种使用二进制的做法,希望能帮到你哟!

【寻找重复数】给定一个包含 n + 1 个整数的数组 nums ,其数字都在 [1, n] 范围内(包括 1 和 n),可知至少存在一个重复的整数。现在假设 nums 只有一个重复的整数,请返回这个重复的数。要求:你设计的解决方案必须不修改数组 nums 且只用常量级 O(1)的额外空间。

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

【解题分析】这道题目最难的地方莫过于它的要求:只能使用常量级的额外空间!既然不能用一般的方法,我们便另辟蹊径,对所有数 [1, n] 进行二进制展开,举个例子如下表所示:

13422xy
第 0 位11

0

0022
第 1 位0101132
第 2 位0010011

        对于第 i 位,我们用 x 记录 nums 中所有数满足二进制形式下第 i 位是 1 的数量有多少。用 y 记录 1 ~ n 中所有数在二进制形式下第 i 位是 1 的数量应该有多少。

        比如说,上表中第 0 位,nums 中的数有 2 个的二进制形式该位为 1,而 1 ~ 4 中该位为 1 的数有 2 个。 

        那么怎么找出重复的数呢?假设重复的数是 k,那么,对于 k 二进制展开后所有为 1 的数位必定会导致 x > y

        但是这个结论我们还是需要证明一下的。

【证明】

        如果 nums 数组中 target 出现了 2 次,其余的数各出现了 1 次,那么如果 target 的第 i 位为 1,那么 nums 数组的第 i 位 1 的个数 x 恰好比 y 大了 1。如果 target 的第 i 位为 0,那么 x = y。

        如果 nums 数组中 target 出现了 3 次及以上,那么必然有一些数不在 nums 数组中。这个时候就相当于我们用 target 替换了这些数,我们要考虑的就是这样的替换对 x 会产生什么影响:       

        1、如果被替换的数第 i 位为 1,且 target 第 i 位为 1:x 不变,满足 x>y。
        2、如果被替换的数第 i 位为 0,且 target 第 i 位为 1:x 加一,满足 x>y。
        3、如果被替换的数第 i 位为 1,且 target 第 i 位为 0:x 减一,满足 x≤y。
        4、如果被替换的数第 i 位为 0,且 target 第 i 位为 0:x 不变,满足 x≤y。

        总而言之,在替换后,如果 target 的第 i 位为 1,那么始终满足 x > y;如果为 0,那么每次替换后始终满足 x ≤ y。因此,接下来我们只需要按照位次复原这个数就可以了。

 

【源码展示】

class Solution {
public:
    int findDuplicate(vector<int>& nums) {
        int n = nums.size(), ans = 0;
        // 确定二进制下最高位是多少
        int bit_max = 31;
        while (!((n - 1) >> bit_max)) {
            bit_max -= 1;
        }
        for (int bit = 0; bit <= bit_max; bit++) {
            int x = 0, y = 0;
            for (int i = 0; i < n; ++i) {
                if (nums[i] & (1 << bit)) {
                    x += 1;
                }
                if (i >= 1 && (i & (1 << bit))) {
                    y += 1;
                }
            }
            if (x > y) {
                ans |= 1 << bit;
            }
        }
        return ans;
    }
};

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

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

相关文章

北京理工大学开设仓颉实践课程,培养特色化软件人才

为响应国家软件发展战略&#xff0c;培养满足产业发展需求的特色化软件人才&#xff0c;北京理工大学信息技术创新学院率先把仓颉语言引入到大二暑期的实践课程中。在今年暑期为期3周的实践课中&#xff0c;信息技术创新学院教研中心副主任徐礼文老师开设了“仓颉语言HarmonyOS…

Git 撤回commit

上一篇&#xff0c;Git撤销add&#xff0c;其实已经讲了用reset命令可以取消commit&#xff0c;这里再啰嗦下。先看&#xff1a; git如何撤回已经commit • Worktile社区 首先明确一点&#xff0c;无论是commit还是撤销commit&#xff0c;都是在本地暂存区操作&#xff0c;而…

CTFHub技能树-Git泄漏-Stash

目录 一、前提知识 1.什么是git stash 2.git文件目录结构 3.git中对象指向 二、解题过程 方法一&#xff1a;使用GitHack 方法二&#xff1a;使用Git_Extract工具&#xff0c;这个是自动解析不用git stash等操作&#xff0c;直接得到flag 当前大量开发人员使用git进行版本…

C/C++:C语言中的__FILE__、__LINE__等几种C标准用法

C语言中的几种特殊标准定义 __FILE__ &#xff1a;正在编译文件的文件名__LINE__ &#xff1a;正在编译文件的行号__DATE__&#xff1a;编译时刻的日期字符串 如“Sep 22 2020”__TIME__&#xff1a;编译时刻的时间字符串 如”10:00:00“__STDC__&#xff1a;判断该文件是不是…

网关功能介绍

在微服务架构中&#xff0c;网关&#xff08;API Gateway&#xff09;扮演着至关重要的角色&#xff0c;它作为客户端和微服务之间的中介&#xff0c;负责路由、过滤、认证、限流等职责。以下是一些常见的网关实现&#xff1a; Spring Cloud Gateway&#xff1a; Spring Cloud …

【佳学基因检测】网站加密证书失效后,如何移除并为新的证书安装准备环境?

【佳学基因检测】网站加密证书失效后&#xff0c;如何移除并为新的证书安装准备环境&#xff1f; 当WoTrus DV Server CA证书失效后&#xff0c;你需要确保你的Nginx配置中不再引用该证书&#xff0c;并且移除或替换相关的证书文件。以下是具体步骤&#xff1a; 1. 确认Nginx…

如何在 cPanel 中使用 PuTTY SSH

cPanel & WHM 的直观网页界面使管理服务器和虚拟主机账户变得轻松。然而&#xff0c;有时在服务器命令行上工作也是很有用的。PuTTY SSH客户端允许您通过加密连接登录到服务器的命令行界面&#xff0c;从而确保敏感数据不会在互联网上暴露。Hostease 提供高性能的服务器&am…

Python | Leetcode Python题解之第391题完美矩形

题目&#xff1a; 题解&#xff1a; class Solution:def isRectangleCover(self, rectangles: List[List[int]]) -> bool:area, minX, minY, maxX, maxY 0, rectangles[0][0], rectangles[0][1], rectangles[0][2], rectangles[0][3]cnt defaultdict(int)for rect in rec…

【区块链 + 物联网】区块链边缘计算网关设备 | FISCO BCOS应用案例

目前边缘端设备主要以人工智能应用为主&#xff0c;或以数据采集网络设备为主&#xff0c;还未有区块链边缘计算网关设备&#xff0c;难以 在依托终端设备的传统行业中进行区块链 应用。本项目研制区块链边缘计算网关&#xff0c;将区块链、计算与网络集成 在一起&#xff0c;…

docker-compose安装mysql8集群

我这里一主两从mysql数据库集群,mysql镜像版本是8.0.39 如下 如下&#xff1a; [rootVM-20-8-centos mysqlData]# docker-compose ps NAME IMAGE COMMAND SERVICE CREATED STATUS PORTS mysql-master …

【C题成品论文2已出】24数学建模国赛C题第二套成品论文(附参考代码)免费分享

假设&#xff1a;每个地块每年种植一种农作物。 针对问题一 单目标优化问题&#xff0c;定义决策变量&#xff0c;定义目标函数、定义约束条件、数据预处理、使用整数规划&#xff0c;编程解决问题。 定义决策变量&#xff1a; Xt,i&#xff1a;在第t年种植第i种作物的亩数…

如何规划Web项目

项目规划 规划步骤 1. 用户故事 从用户的角度描述应用程序的功能。所有用户故事放在一起描述了整个应用程序 2. 功能 3. 流程图&#xff08;我们将去构建什么&#xff09; 4. 架构&#xff08;我们如何去构建他&#xff09; 下一步就是开发步骤&#xff08;使用代码来实现我…

聊聊资源调度

资源调度 般分为两个阶段&#xff1a; 是实现物理资源的虚拟化&#xff08;即资源的抽象&#xff09;于当前机器的性能越来越好&#xff0c;硬件配置越来越高&#xff0c;直接用物理机跑业务比较浪费&#xff0c;所以将物理机分割成更小单位的虚拟机&#xff0c;这样可以显著提…

“人大金仓”正式更名为“电科金仓”; TDSQL-C支持回收站/并行DDL等功能; BigQuery支持直接查询AlloyDB

重要更新 1. “人大金仓”正式更名为“电科金仓”&#xff0c;完整名称“中电科金仓&#xff08;北京&#xff09;科技股份有限公司”&#xff0c;突出金仓是中国电子科技集团有限公司在基础软件领域产品( [1] ) 。据悉人大金仓在上半年营收入为9056万元&#xff0c;净利润约21…

idea中配置Translation插件完成翻译功能

文章目录 idea下载插件配置有道云阿里云百度翻译开放平台 idea下载插件 idea中安装Translation插件 使用方法&#xff1a;右下角选择翻译引擎&#xff0c;鼠标选中想翻译的部分&#xff0c;右键翻译即可 之前一直用的微软的翻译&#xff0c;不需要配置&#xff0c;但是最近微软…

Unity Adressables 使用说明(七)诊断工具(Diagnostic tools)

Addressables 包含诊断工具&#xff0c;用于分析你的 Addressables setup、performance 和 build result 。 Addressables Profiler Module Addressables Profiler 是一个 Unity 编辑器 Profiler 模块&#xff0c;可以用来了解从 Addressables 加载的内容。 前提条件 必须启…

【LeetCode】06.Z字形变换

题目要求 解题思路 首先映入我们脑海的就是暴力。这一方法可行&#xff0c;但是时间复杂度空间复杂度很高&#xff0c;因此我们使用找规律的方法。这样的话我们可以模拟插入下标&#xff0c;这样的话很容易发现首行和末行插入的位置刚好是d2*n-2&#xff0c;而中间行的两个位置…

Linux环境中安装java环境(JDK8环境)

需求背景&#xff1a; 给国产服务器&#xff08;银河麒麟V10&#xff09;中安装项目运行环境&#xff0c;安装java环境&#xff01;具体如下 下载jdk包 访问Oracle官网下载jdk包&#xff1a;Java Downloads | Oracle 中国 选择对应的cpu架构进行下载 https://download.csdn.…

OpenCV视频处理练习案例-学习篇

需要实现的功能&#xff1a; 用OpenCV打开一段视频&#xff0c;将每一帧画面压缩成540p&#xff0c;对画面进行垂 直翻转&#xff0c;转为黑白&#xff0c;然后添加高斯噪声&#xff0c;把处理好的每一帧画面保存 成一个mp4文件保存到本地 Python代码如下&#xff1a; impor…

第143天:内网安全-权限维持自启动映像劫持粘滞键辅助屏保后门WinLogon

案例一&#xff1a; 权限维持-域环境&单机版-自启动 自启动路径加载 路径地址 C:\Users\Administrator\AppData\Roaming\Microsoft\Windows\StartMenu\Programs\Startup\ ##英文C:\Users\Administrator\AppData\Roaming\Microsoft\Windows\开始菜单\程序\启动\ ##中文…