【重点】【二分查找】287.寻找重复数

算法——寻找重复的数 案例分析: 给定一个包含n + 1 个整数的数组nums,其数字都在 1 到 n之间(包括 1 和 n),可知至少存在一个重复的整数。假设只有一个重复的整数,找出这个重复的数。 示例 1: 输入: [1,3,4,2,2] 输出: 2 示例 2: 输入: [3,1,3,4,2] 输出: 3 说明: 不能更改原数组(假设数组是只读的)。 只能使用额外的 O(1) 的空间。 时间复杂度小于 O(n2) 。 数组中只有一个重复的数字,但它可能不止重复出现一次。 方法一:利用hash... 阅读详情

题目
2种方法,都要理解掌握!最简单的基于HashSet的就不写在下面了,过于简单了。
一道类似的 题目,对比学习!0~n-1中缺失的数字

法1:二分查找,O(nlogn)

在这里插入图片描述

时间复杂度:O(nlogn)
在这里插入图片描述

Python

class Solution:
    def findDuplicate(self, nums: List[int]) -> int:
        l, r = 1, len(nums) - 1 # l和r分别是起始数字1和n, 不是索引
        while l < r:
            mid = (l + r) // 2
            count = 0
            for i in nums:
                if i <= mid:
                    count += 1
            if count <= mid: # 这种情况重复的数字一定大于mid!
                l = mid + 1
            else:            # 有可能重复的数字是mid
                r = mid

        return l

Java

必须熟练掌握!

class Solution {
    public int findDuplicate(int[] nums) {
        int n = nums.length;
        int left = 1, right = n; // 1和n是数字,与数组索引无关
        while (left < right) {
            int mid = left + (right - left) / 2;
            int count = 0;
            for (int i : nums) {
                if (i <= mid) {
                    ++count;
                }
            }
            if (count <= mid) { // 这种情况重复的数字一定大于mid!
                left = mid + 1;
            } else {            // 有可能重复的数字是mid
                right = mid;
            }
        }

        return left;
    }
}

法2:环形链表

参考答案

class Solution {
    public int findDuplicate(int[] nums) {
        int slow = 0, fast = 0;
        do {
            slow = next(nums, slow);
            fast = next(nums, next(nums, fast));
        } while (slow != fast);
        slow = 0;
        while (slow != fast) {
            slow = next(nums, slow);
            fast = next(nums, fast);
        }

        return slow;
    }

    public int next(int[] nums, int inx) {
        return nums[inx];
    }
}
二分查找专题 剑指53:0~n-1中缺失的数字 这里要说明一下为什么是l<=r。因为初始化时我的r赋值是nums.length-1而不是nums.length.这二者其实是有很大区别的。前者相当于两端都是闭区间【l,r】,后者相当与左闭右开区间【l,r)。然后当搜索区间为空的时候就应该终止。这里的while(l<=r)的终止条件就是l == r+1,也就是此时的搜索区间是【r... 阅读详情

相关推荐

STM32H7 FOC控制时序优化与PWM中点更新策略

在永磁同步电机(PMSM)的磁场定向控制(FOC)系统中,控制时序精度是决定电流环带宽、观测器收敛性与动态响应能力的基础要素。其核心在于理解PWM生成、ADC采样与控制计算三者之间的硬件级时间耦合关系——尤其在中心对齐模式下,标准更新机制引入的半周期延迟会破坏电压-电流瞬时映射,导致滑模观测器失配与高频相位滞后。通过将PWM更新事件绑定至重复计数器(RCR)清零点,可实现控制指令在开关周期中点生效,使等效电压矢量中心与计算时刻严格对齐。该策略显著提升系统确定性,为20 kHz以上高频电流环提供物理支撑,并广

flink9streamer的博客 857

算法141:寻找重复数

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

Winn~ 177

RK3588设备树节点实战:从零配置音频与显示模块(ES8388+DSI0)

本文详细介绍了在RK3588平台上配置音频编解码器ES8388和显示接口DSI0的设备树节点实战。通过具体案例拆解设备树节点的编写逻辑与调试技巧,包括音频路由与声卡配置、DSI控制器基础配置、视频通路路由配置以及电源管理与时钟树设计。文章还提供了调试工具与实战技巧,帮助开发者快速解决常见问题。

weixin_42525637的博客 351

287. 寻找重复数

,可知至少存在一个重复的整数。你设计的解决方案必须。

qq_42120843的博客 178

从CAD图纸到GIS地图:手把手教你用Global Mapper处理DWG文件(含坐标配准)

本文详细介绍了如何使用Global Mapper将CAD图纸(DWG文件)转换为GIS地图,包括坐标配准、图层与属性转换等关键步骤。通过四参数变换和控制点匹配技术,确保数据精准转换,适用于测绘、城市规划等领域。文章还提供了高级处理技巧和质量控制流程,帮助用户高效完成GIS化工作。

weixin_29196891的博客 521

激光及激光器超全细节&原理总结

本文详细展示了激光、激光器、PN结、半导体激光器、光纤激光器的原理和应用;

guangwulv的博客 5343

LeetCode 287. 寻找重复数

可以用二分查找法,一步步判断重复数字,是处于[1,mid]和[mid+1,n]两个区间中的哪个区间,每次判断都需要遍历一遍数组,统计在[1,mid]区间中的数字个数cnt,如果cnt大于区间内的元素数量,那么这个重复元素一定在[1,mid]这个区间内,根据二 分法缩小区间;反之亦然,最后min所指的元素,就是重复元素。虽然nuns不是有序数组,但是我们可以想象一个[1,2,3...n]这样的有序数组,来使用二分查找,而且空间复杂度为O(1)。题目给出nums包含。),可知至少存在一个重复的整数。

qscfgjn的博客 266

防火墙断网后Adobe软件还弹窗“THIS APP HAS BEEN DISABLED”?原来是科学上网导致的问题!用这个简单方法一键解决!

很多小伙伴在使用上网工具的时候时,突然遇到Adobe弹出“THIS APP HAS BEEN DISABLED”的烦人提示,这个非正版弹窗真的让人头疼!即使你之前尝试过,有时也不奏效,究其原因,原来是因为你使用了代理网络,这时Adobe的流量并不是走本地,而是走代理,导致防火墙的拦截无效。不用慌!今天我来教大家如何通过上网工具,轻松禁用Adobe验证的联网流量,彻底解决这个问题!

qq_34093397的博客 3万+

Java版LeetCode热题100之寻找重复数:深入解析与实战应用

约束驱动设计:在严格限制下(不修改 + O(1) 空间),必须跳出常规思维。隐式建模能力:将数组视为函数图,是高级算法设计的关键。Floyd 算法的威力:不仅用于链表,还可解决数组重复、随机数周期等问题。多种解法对比:理解不同方法的 trade-off(时间 vs 空间 vs 复杂度)。

吾为热爱计科,致力于知识分享的践行者,此博客是我在这条道路上留下的足迹。 680

uniapp 开发微信小程序请求问题 , 真机调试正常,开发工具正常,但是使用扫码预览接口都是不通的,发布到体验版也是请求失败

uniapp开发小程序体验版接口请求失败(真机可以)

weixin_60408555的博客 3954

MacX DVD Ripper Pro for Mac(DVD解码器) 6.2.120190416免激活版

只需要5分钟即可转档一张DVD光碟!并允许我们在编码之前预览、编辑、裁剪、修剪或扩展视频。第一款也是唯一一款能够支持DVD到MP4,H.264,MOV,FLV,MPEG4等所有格式DVD(新DVD,99-标题DVD,损坏和无法播放的DVD)和翻录DVD / ISO映像的工具,AVI,QT,MP3等。借助350多种预设配置文件MacX DVD Ripper Pro for Mac(DVD解码器) 6...

llhf688的博客 890

LeetCode287.寻找重复数

涉及到的算法:哈希表判重、二分查找、快慢指针 抽屉原理以及【Floy判圈算法】

冢狐的私人空间 634

《RT-DETR魔术师》专栏介绍 & 优快云独家改进创新实战 & 专栏目录

通过本专栏的阅读,后续你也可以自己魔改网络,在网络不同位置(Backbone、head、neck、loss等)进行魔改,实现创新!!!

①答疑群聊服务;②YOLO大模型知识问答系统;③计算机视觉论文生成智能体; 7363

位运算题目:寻找重复数

由于数组的长度是n1n + 1n1,且最多包含nnn个不同的整数。根据抽屉原理(或鸽笼原理)可知,将数组的n1n + 1n1个位置分配到nnn个不同的整数,至少有两个位置分配到同一个整数,即该整数在数组中重复。因此数组中至少存在一个重复的数字。由于这道题要求不修改数组且空间复杂度是O1O(1)O1,因此排序、哈希表等解法都是不允许的,需要使用其他解法寻找重复的数字。

stormsunshine的博客 1898

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

【Leetcode hot 100】287.寻找重复数

摘要: LeetCode 287题要求在一个长度为n+1的数组(元素范围为[1,n])中找到唯一重复的数字,且不能修改数组并使用O(1)空间。两种主要解法:1)快慢指针法(时间复杂度O(n)),将数组视为链表,通过Floyd算法找到环的入口即为重复数;2)二分查找法(时间复杂度O(n log n)),基于抽屉原理统计小于等于中间值的元素个数来缩小范围。两种方法均满足空间约束,快慢指针效率更高但较难理解,二分查找更直观但稍慢。常见误区包括排序法、哈希表法等会违反题目约束的解法。

专注Java和MySQL领域知识分享 1097

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

LeetCode 287.寻找重复数

这道题目有多种解题方法,还是非常考验经验积累和思路的,不然像作者一样只会使用哈希表和暴力了,第四种方法快慢指针,使用的Floyd判圈算法真的十分巧妙,将链表中的判断是否有环的思路运用到数组中去,也能实现同样的效果,只能说是异曲同工之妙了!当没有什么思路的时候,不妨将各种数据结构都想一遍,看能不能找到合适的数据结构解题!路漫漫其修远兮,吾将上下而求索!与君共勉!

墨白的博客 1308

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Leetcode 287 寻找重复数【中等】

题目 看到查找重复数,容易想到的方法有: 用哈希表判重,但这违反了说明2; 将原始数组排序后,重复的数相邻,就可以通过判断相等找出重复数,但这违反了说明1; 方法一:二分查找 二分查找可以用于确定一个有范围的整数。 本题要求查找的重复数都在1~n之间,所以可以采用二分查找。 具体思路: 先猜一个数(有效范围 [left, right]里的中间数 mid),然后统计原始数组中小于等于这个中间数的元素的个数 cnt,如果 cnt 严格大于 mid,根据抽屉原理,重复元素就在区间 [left, mid] 里。

qq_35970322的博客 274

LeetCode 热题 100 之 287.寻找重复数

摘要:本文探讨了在不修改数组且仅用O(1)空间条件下,寻找数组中唯一重复数的三种解法。最优解是快慢指针法(Floyd判圈算法),将数组视为链表找环入口,时间复杂度O(n);二分查找法基于鸽巢原理,时间复杂度O(nlogn),更易理解;二进制统计法按位分析,适合进阶学习。三种方法均满足题目要求,快慢指针最适合面试,二分查找最易实现,二进制统计法则能锻炼位运算思维。核心都是利用"元素数>取值数"的特性定位重复数。

2401_87662859的博客 534

287. 寻找重复数,169. 多数元素

由题目知道,数组的长度是n+1,而数字范围在[1,n],因此如果这些数字范围要构成一个没有重复数的数组,那其长度最长为 n, 即[1,n]的每个数字都不重复。而当前数组长度是n+1, 所以一定有重复的数字。实现方式有三种。

weixin_59234335的博客 916

Leetcode287

题目 Leetcode287 给定一个包含n + 1 个整数的数组nums,其数字都在 1 到 n之间(包括 1 和 n),可知至少存在一个重复的整数。假设只有一个重复的整数,找出这个重复的数。 示例 1: 输入: [1,3,4,2,2] 输出: 2 示例 2: 输入: [3,1,3,4,2] 输出: 3 说明: 不能更改原数组(假设数组是只读的)。 只能使...

记录学习过程所学 1094

java重复数字_287. 寻找重复数 Java解法

287. 寻找重复数这题的难点就在于下面的说明了,我们先不管下面的那些说明的要求,用常规的解法来解答下上的题目。排序思想解法先把原来的数组进行排序,然后逐个遍历,一旦发现后一个元素和当前的元素相等,那么就返回,这就是我们找到了重复数字。但是这种思想,就不满足说明里面的,不能改变原数组,虽然时间复杂度是满足O(n^2)。哈希思想用个哈希集合(HashSet)来记录已经出现过的元素,一旦遍历到了元素曾...

weixin_39594296的博客 326

287.寻找重复数

摘要:该算法在O(1)空间复杂度下找出数组中唯一的重复数字。通过快慢指针法,第一阶段找到环的相遇点,第二阶段确定环入口即为重复数字。时间复杂度O(n),空间复杂度O(1),且不修改原数组。算法巧妙地将数组视为链表,利用重复数字形成的环来定位解。

qq_52075456的博客 32

LeetCode 热题 HOT 100 第六十七天 287. 寻找重复数 中等题 用python3求解

题目地址 给定一个包含 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提示: 1 ...

weixin_40634691的博客 580

二分查找(折半查找)

值得注意的就是,这道题这道题的数字范围。我们计算出的mid一定是1-n之间其中的一个数。若nums数组中1-mid没有重复的话,count等于mid,也就意味着重复的数字出现在(mid+1)-n之间,所以l=mid+1……。最关键的点就是要理解,mid在这不像一般二分查找中它是下标,mid在这是nums中的数。 给定一个包含 n + 1 个整数的数组 nums,其数字都在 1 到 n 之间(包括 ...

realism_的博客 175

二分查找法模板

基本思想 1)首先把循环可以进行的条件写成 while(left < right),在退出循环的时候,一定有 left == right 成立,此时返回 left 或者 right 都可以 (2)“神奇的”二分查找法模板的基本思想(特别重要) “排除法”即:在每一轮循环中排除一半以上的元素,于是在对数级别的时间复杂度内,就可以把区间“夹逼” 只剩下 1 个数,而这个数是不是我们要找的数,单独...

Wenweno0o的博客 724
上一篇: 【重点】【特例】31.下一个排列
下一篇: 【重点】【DFS】111. 二叉树的最小深度
Allenlzcoder
博客等级 码龄10年 925粉丝 512原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值