leetcode 287 Find the Duplicate Number
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了leetcode 287 Find the Duplicate Number相关的知识,希望对你有一定的参考价值。
题意:给一个长度为n+1的整数序列,其中的元素的范围在[1,n]之间,所以一定有重复的数字,假设只有一种重复的数字(但是重复可能不止一遍),求这个重复的数字,要求空间复杂度O(1),时间复杂度小于O(n2),不可以修改序列。
解法:二分。二分重复的数字,每次遍历一遍数组,记录cnt为有多少个元素小于等于二分值,如果cnt大于二分值,则说明重复的数字在左区间,否则重复的数字在右区间。这样做时间复杂度O(nlogn)。
二分真是个好用的东西吖……
代码:
class Solution { public: int findDuplicate(vector<int>& nums) { int l, r, mid; l = 1; r = nums.size() - 1; mid = (l + r) >> 1; while(l < r) { int cnt = 0; for(int i = 0; i < nums.size(); i++) { if(nums[i] <= mid) cnt++; } if(cnt <= mid) l = mid + 1; else r = mid; mid = (l + r) >> 1; } return l; } };
以上是关于leetcode 287 Find the Duplicate Number的主要内容,如果未能解决你的问题,请参考以下文章
LeetCode 287. Find the Duplicate Number(找重复数字)
[LeetCode] 287. Find the Duplicate Number
LeetCode 287. Find the Duplicate Number
<LeetCode OJ> 287. Find the Duplicate Number