287. Find the Duplicate Number
来源:互联网 发布:html5解析json 编辑:程序博客网 时间:2024/04/29 17:45
Given an array nums containing n + 1 integers where each integer is between 1 and n (inclusive), prove that at least one duplicate number must exist. Assume that there is only one duplicate number, find the duplicate one.
Note:
You must not modify the array (assume the array is read only).
You must use only constant, O(1) extra space.
Your runtime complexity should be less than O(n2).
There is only one duplicate number in the array, but it could be repeated more than once.
Credits:
Special thanks to @jianchao.li.fighter for adding this problem and creating all test cases.
实际上,我们可以根据抽屉原理简化刚才的暴力法。我们不一定要依次选择数,然后看是否有这个数的重复数,我们可以用二分法先选取n/2,按照抽屉原理,整个数组中如果小于等于n/2的数的数量大于n/2,说明1到n/2这个区间是肯定有重复数字的。比如6个抽屉,如果有7个袜子要放到抽屉里,那肯定有一个抽屉至少两个袜子。这里抽屉就是1到n/2的每一个数,而袜子就是整个数组中小于等于n/2的那些数。这样我们就能知道下次选择的数的范围,如果1到n/2区间内肯定有重复数字,则下次在1到n/2范围内找,否则在n/2到n范围内找。下次找的时候,还是找一半。
注意
我们比较的mid而不是nums[mid]
因为mid是下标,所以判断式应为cnt > mid,最后返回min
主要是边界条件的处理。
public class Solution { public int findDuplicate(int[] nums) { int low = 1; int high = nums.length-1; while(low<high){ int mid = low + (high-low)/2; int cnt = 0; for(int num:nums){ if(num <= mid) cnt++; } if(cnt <= mid) { low = mid+1; }else{ high = mid; } } return low; }}
- 287. Find the Duplicate Number
- 287. Find the Duplicate Number
- 287. Find the Duplicate Number
- 287. Find the Duplicate Number
- 287. Find the Duplicate Number
- 287. Find the Duplicate Number
- 287. Find the Duplicate Number
- 287. Find the Duplicate Number
- 287. Find the Duplicate Number
- 287. Find the Duplicate Number
- 287.Find the Duplicate Number
- 287. Find the Duplicate Number
- 287. Find the Duplicate Number
- 287. Find the Duplicate Number
- 287. Find the Duplicate Number
- 287. Find the Duplicate Number
- 287. Find the Duplicate Number
- 287. Find the Duplicate Number
- 十进制转换成十六进制
- 用开源 ASP.NET MVC 程序 Bonobo Git Server 搭建 Git 服务器
- 贫血,充血模型的解释以及一些经验
- ListView的Item上有单选按钮
- 正则表达式
- 287. Find the Duplicate Number
- Gambit 5.调试
- Echart-3 学习总结
- css的hover事件 鼠标滑过让该元素的子元素或者其他元素演示该表
- Android之Handler消息机制
- 异步请求 ajax的使用详解
- SlideDateTimePicker 源码学习
- 10种简单的Java性能优化
- Java中的mysql事务处理