題目鏈接
題解:
class Solution {
public:
int findDuplicate(vector<int>& nums) {
map<int,int>a;
vector<int>::iterator it;
for(it=nums.begin();it!=nums.end();it++){
if(a[*it]==0){
a[*it]=1;
}else{
return *it;
}
}
}
};
這是利用map來求解,不符合題意,但是AC了。空間複雜度爲O(n)
,時間複雜度O(n);
大神題解:(利用折半查找來求重複的值,因爲是順序輸入的1-n,
當有一個數值重複時,左右總有一半會多一個數字,所以就像那一半
縮小,最終找到答案)
class Solution {
public:
int findDuplicate(vector<int>& nums) {
int n=nums.size()-1;
int low=1;
int high=n;
int mid;
while(low<high){
mid=(low+high)/2;
int count=0;
for(int num:nums){
if(num<=mid) count++;
}
if(count>mid) high=mid;
else low=mid+1;
}
return low;
}
};