【leetcode】287. 寻找重复数
题目链接:传送门
题目描述:
给定一个数组 nums 包含 n + 1 个整数,每个整数在 1 到 n 之间,包括 1 和 n。现在假设数组中存在一个重复的数字,找到该重复的数字。
注意
- 不能修改数组元素,假设数组是只读的。
- 仅可以使用常数即O(1)O(1)的额外空间。
- 时间复杂度需要低于O(n2)O(n2)。
- 数组中仅有一个重复数字,但它可能重复超过1次。
样例
Example 1:
Input: [1,3,4,2,2]
Output: 2
Example 2:
Input: [3,1,3,4,2]
Output: 3
算法
(双指针移动) O(n)
因为每个数都是 1 到 n,所以此题可以当做Linked List Cycle II来处理。
首先first和second指针均为0,然后first每次前进一格,second每次前进两格。i前进一格在这里指的是nums[i]。剩余部分请参考Linked List Cycle II中的算法证明。
时间复杂度
参见Linked List Cycle II时间复杂度部分,整个数组仅遍历常数次,故时间复杂度为O(n)。
作者:wzc1995
链接:https://www.acwing.com/solution/LeetCode/content/302/
将数组转化为链表形式:数组 [1,3,4,2,2]
| current / index |
0 |
1 | 2 | 3 | 4 |
|
next / num[index] |
1 | 3 | 4 | 2 | 2 |
index为当前值的索引,num[index]为下个一值的索引next index。上表中的数组表示成链表如下图,方框中为index, num[index]

利用【142_环形链表 II】的方法,找到环入口,即为重复数字
设:
slow指针移动速度为1,fast指针移动速度为2;slow指针在环内移动(非环部分)长度为a,slow指针在环内移动长度为b
两指针相遇时候,slow指针移动距离为a+b,fast指针移动距离为2(a+b),可知两指针距离差a+b即为整数倍的环长
从head移动a的距离为入环点;由2可知从head开始移动a+(a+b)的距离也为入环点,即将A点继续移动距离a则可到达入环点
将slow指针移动回head,同时同速移动两个指针,相遇点即为入环点
说明:
因为数组中不含0,所以不会因为index = 0, num[0] = 0导致死循环;对于其他位置index = num[index],若该值重复则会自身成环,若无重复则不会被遍历到
作者:LuoRong1994
链接:https://leetcode-cn.com/problems/two-sum/solution/287_xun-zhao-zhong-fu-shu-by-user9081a/
class Solution {
public:
int findDuplicate(vector<int>& nums) {
int cnt = ;
int L = , R = nums.size() - , Mid , ans = ;
while ( L < R ) {
Mid = (L+R) >> ;
cnt = ;
for ( int x : nums )
cnt += L <= x && x <= Mid ;
if ( Mid - L + < cnt ){
R = Mid ;
}else {
L = Mid + ;
}
}
return R ;
}
};
二分做法
class Solution {
public:
int findDuplicate(vector<int>& nums) {
int Fir , Sec ;
Fir = Sec = ;
do{
Fir = nums[Fir] ;
Sec = nums[nums[Sec]] ;
}while ( Fir != Sec );
Fir = ;
while ( Fir != Sec ){
Fir = nums[Fir] ;
Sec = nums[Sec] ;
}
return Fir;
}
};
双指针
【leetcode】287. 寻找重复数的更多相关文章
- Java实现 LeetCode 287 寻找重复数
287. 寻找重复数 给定一个包含 n + 1 个整数的数组 nums,其数字都在 1 到 n 之间(包括 1 和 n),可知至少存在一个重复的整数.假设只有一个重复的整数,找出这个重复的数. 示例 ...
- leetcode 287寻找重复数
这道题用STL容器就很好写了,可以用set也可以用map, 用unordered_map的C++代码如下: class Solution { public: int findDuplicate(vec ...
- LeetCode | 287. 寻找重复数
特别感谢LeetCode大佬陈牧远的科普知识 给定一个包含 n + 1 个整数的数组 nums,其数字都在 1 到 n 之间(包括 1 和 n),可知至少存在一个重复的整数.假设只有一个重复的整数,找 ...
- [LeetCode]287. 寻找重复数(二分)
题目 给定一个包含 n + 1 个整数的数组 nums,其数字都在 1 到 n 之间(包括 1 和 n),可知至少存在一个重复的整数.假设只有一个重复的整数,找出这个重复的数. 示例 1: 输入: [ ...
- LeetCode:寻找重复数【287】
LeetCode:寻找重复数[287] 题目描述 给定一个包含 n + 1 个整数的数组 nums,其数字都在 1 到 n 之间(包括 1 和 n),可知至少存在一个重复的整数.假设只有一个重复的整数 ...
- Leetcode之二分法专题-287. 寻找重复数(Find the Duplicate Number)
Leetcode之二分法专题-287. 寻找重复数(Find the Duplicate Number) 给定一个包含 n + 1 个整数的数组 nums,其数字都在 1 到 n 之间(包括 1 和 ...
- 287. 寻找重复数 Java解法
287. 寻找重复数 这题的难点就在于下面的说明了,我们先不管下面的那些说明的要求,用常规的解法来解答下上的题目. 排序思想解法 先把原来的数组进行排序,然后逐个遍历,一旦发现后一个元素和当前的元素相 ...
- 【Leetcode】287. 寻找重复数(数组模拟链表的快慢指针法)
寻找重复数 根据题意,数组中的数字都在1~n之间,所以数字的范围是小于数组的范围的,数组的元素可以和数组的索引相联系. 例如:nums[0] = 1 即可以将nums[0]作为索引 通过nums[0] ...
- Leetcode题目287.寻找重复数(中等)
题目描述: 给定一个包含 n + 1 个整数的数组 nums,其数字都在 1 到 n 之间(包括 1 和 n),可知至少存在一个重复的整数.假设只有一个重复的整数,找出这个重复的数. 示例 1: 输入 ...
随机推荐
- Spring Cloud Config(二):基于Git搭建配置中心
1.简述 本文选用Git作为配置仓库,新建两个环境的配置文件夹,dev 和 test,文件夹中分别存放 Config Client 端的配置文件,目录结构如下: ├ ─ ─ dev └ ─ ─ con ...
- Window操作系统_根据端口查看进行PID 并杀掉进程
Windows 如何查看本地端口被进程占用的情况? 传送门 Windows 根据端口查看进行PID 并杀掉进程[推荐] 传送门 转载目的:做JavaWeb项目时总提示我80/8080端口号被占用... ...
- 线上bug或故障界定及填写规范
[线上故障与线上Bug界定] 一.线上故障: 1. 故障参照公司规范稍做调整: a) 1级故障:资讯首页或主App首页无法打开:多条业务线同时不可用:超过15分钟: b) ...
- jvm方法栈
调用栈 先入后出 栈是一个只有一个口的容器,先进入栈的会落到栈底,出栈的时候最后出.最后进入栈的,在栈顶,出栈时先出. 方法调用时,需要在内存中开辟一块存储空间做为线程栈空间 每个线程都由自己的栈 调 ...
- BufferedWriter中write与close函数使用
BufferedWriter 是一个缓冲字符输出流,可以将要输出的内容先缓冲到一个字符数组中,等字符数组满了才一次性写到输出流内,默认的字符数组长度为8192.使用BufferedWriter 时需要 ...
- .md 即 markdown 文件的基本常用编写语法
0. 前言 Markdown 是一种纯文本格式的标记语言.通过简单的标记语法,它可以使普通文本内容具有一定的格式.现在的项目都使用了 git 仓库,再加上远程仓库 github 托管,那就难免要写一些 ...
- http://www.cda.cn/view/25735.html
通过实例浅析Python对比C语言的编程思想差异 我一直使用 Python,用它处理各种数据科学项目. Python 以易用闻名.有编码经验者学习数天就能上手(或有效使用它). 听起来很不错,不过,如 ...
- 本地文件上传到Linux服务器
1.从服务器上下载文件scp username@servername:/path/filename /var/www/local_dir(本地目录) 例如scp root@192.168.0.101: ...
- iframe高度自适应方法
<iframe width="100%" id="tbbrecommend" name="tbbrecommend" src=&quo ...
- 【ARTS】01_28_左耳听风-201900520~201900526
ARTS: Algrothm: leetcode算法题目 Review: 阅读并且点评一篇英文技术文章 Tip/Techni: 学习一个技术技巧 Share: 分享一篇有观点和思考的技术文章 Algo ...