[leetcode] 287. Find the Duplicate Number 解题报告
2016-01-14 14:36
531 查看
题目链接:https://leetcode.com/problems/find-the-duplicate-number/
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
There is only one duplicate number in the array, but it could be repeated more than once.
思路:这题有一个定理叫做鸽笼原理,大意就是n个东西放到m个容器中,如果n > m,那么必然有一个容器包含多于一个东西。
而这题把数据范围限制在1-n之间也是别有用意,这样我们就可以用二分查找来不断缩小范围来找到重复的数。
我们使用二分查找先确定一个中间值mid,然后统计整个数组,看比mid小的数是否比mid多,如果多的话,说明重复的值就在[left, mid-1]之间,否则就在[mid+1, right]之间。
代码如下:
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.
思路:这题有一个定理叫做鸽笼原理,大意就是n个东西放到m个容器中,如果n > m,那么必然有一个容器包含多于一个东西。
而这题把数据范围限制在1-n之间也是别有用意,这样我们就可以用二分查找来不断缩小范围来找到重复的数。
我们使用二分查找先确定一个中间值mid,然后统计整个数组,看比mid小的数是否比mid多,如果多的话,说明重复的值就在[left, mid-1]之间,否则就在[mid+1, right]之间。
代码如下:
class Solution { public: int findDuplicate(vector<int>& nums) { int left = 1, right = nums.size()-1; while(left <= right) { int cnt = 0, mid = (left+right)/2; for(auto val: nums) if(val <= mid) cnt++; if(cnt <= mid) left = mid+1; else right = mid-1; } return left; } };
<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">参考:http://www.cnblogs.com/grandyang/p/4843654.html</span>
相关文章推荐
- ios蓝牙开发(二)
- 测试工作——Web测试需要了解的内容
- iOS开发之事件传递响应链
- 学习笔记8: android stuido 如何获取SHA1数字签名,MD5信息
- C#使用post提交http请求
- 索引的创建和删除
- 如何借助windowns的VHD引导特性实现VHD多windows系统共存
- Unity中C#单例模式使用总结
- 谷歌做了一个艰难的决定:安卓系统不再用Java API 了
- win7 + VS2010配置opencv、boost、QT、QT-addin、CGAL
- JQuery中如何重置(reset)表单
- 利用 canvas 破解 某拖动验证码
- ListView下拉刷新,上拉自动加载更多
- 更换key后,跳板机known_hosts保留原来认证信息,无法认证登录
- WeakHashMap解析
- RAID5阵列硬盘离线怎么恢复
- XMPP协议学习笔记二
- 使用树莓派实现微信远程监控
- 什么是网络连接状态指示器NCSI
- Tomcat热部署方法(3种)【转】