287 Find the Duplicate Number 寻找重复数
一个长度为 n + 1 的整形数组,其中的数字都在 1 到 n 之间,包括 1 和 n ,可知至少有一个重复的数字存在。假设只有一个数字重复,找出这个重复的数字。
注意:
不能更改数组内容(假设数组是只读的)。
只能使用恒定的额外空间,即要求空间复杂度是 O(1) 。
时间复杂度小于 O(n2)
数组中只有一个数字重复,但它可能不止一次重复出现。
详见:https://leetcode.com/problems/find-the-duplicate-number/description/
方法一:
class Solution { public: int findDuplicate(vector<int>& nums) { int left=1,right=nums.size()-1; while(left<right) { int mid=left+(right-left)/2; int cnt=0; for(int val:nums) { if(val<=mid) { ++cnt; } } if(cnt<=mid) { left=mid+1; } else { right=mid; } } return left; } };
方法二:
class Solution { public: int findDuplicate(vector<int>& nums) { int s=0,f=0,t=0; while(true) { s=nums[s]; f=nums[nums[f]]; if(s==f) { break; } } while(true) { s=nums[s]; t=nums[t]; if(s==t) { break; } } return s; } };
参考:https://www.cnblogs.com/grandyang/p/4843654.html