leetcode 287 Find the Duplicate Number寻找重复数
Posted Joel_Wang
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了leetcode 287 Find the Duplicate Number寻找重复数相关的知识,希望对你有一定的参考价值。
这道题用STL容器就很好写了,可以用set也可以用map,
用unordered_map的C++代码如下:
1 class Solution { 2 public: 3 int findDuplicate(vector<int>& nums) { 4 unordered_map<int, int> m; 5 int res; 6 for(int i=0;i<nums.size();i++){ 7 if(m.count(nums[i])){ 8 res=nums[i];break; 9 } 10 m[nums[i]]=i; 11 } 12 return res; 13 } 14 };
12ms beat 44%
使用set:
1 class Solution { 2 public: 3 int findDuplicate(vector<int>& nums) { 4 set<int> s; 5 int res; 6 for(int i=0;i<nums.size();i++){ 7 if(s.find(nums[i])!=s.end()){ 8 res=nums[i];break; 9 } 10 s.insert(nums[i]); 11 } 12 return res; 13 } 14 };
16ms beat 33%
C++ 二分法:
但是,但是,但是,题目要求time O(n2) space O(1) 说明这道题要时间换空间,那么使用二分法:
timeO(nlog(n)) spaceO(1): 1 2 2 3 5 4对于某个数x,如果小于等于他的数出现次数大于他,说明重复数在【low,x】之间,如小于等于2的数有3个,那么重复数在【1,2】之间;小于等于1的数只有1个,那么在【2,2】之间,从而得解
class Solution { public: int findDuplicate(vector<int>& nums) { //二分法 /*理论分析,所有的数出现的次数总和加起来为n+1==len,计mid=(low+high)/2;那么当小于mid出现次数大于mid时,则重复数在mid左边*/ int len=nums.size(); int low=1,high=len-1; while(low<high){ int mid=low+(high-low)/2,cnt=0; for(int num:nums) if(num<=mid) cnt++; if(cnt>mid) high=mid; else low=mid+1; } return low; } };
快慢指针:
class Solution { public: int findDuplicate(vector<int>& nums) { int n=nums.size()-1; if(n<1) return 1; int slow = nums[0]; int fast = nums[nums[0]]; //vector<int> fs={fast},ss={slow},ts; while (slow != fast) { slow = nums[slow]; fast = nums[nums[fast]]; //fs.push_back(fast); //ss.push_back(slow); } int target=0; while (target != slow){ slow=nums[slow]; target=nums[target]; //ts.push_back(target); //ss.push_back(slow); } /* cout<<"fs: "; for(int n:fs) cout<<n<<","; cout<<endl; cout<<"ss: "; for(int n:ss) cout<<n<<","; cout<<endl; cout<<"ts: "; for(int n:ts) cout<<n<<","; cout<<endl;*/ return target; } };
以上是关于leetcode 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