Sword Finger Offer Question Fifty
The topic is as follows
Idea and code
Direct map query
This kind of thinking has been used many times before
... It is speechless. Obviously, the condition of 0 to n-1 is not used in this question.
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param numbers int整型vector
* @return int整型
*/
int duplicate(vector<int>& numbers) {
// write code here
map<int,int> m;
for(auto i:numbers){
if(m.find(i)!=m.end()) return i;
else m[i]=0;
}
return -1;
}
};
Slightly improved, vector does not need to be queried every time like map
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param numbers int整型vector
* @return int整型
*/
int duplicate(vector<int>& numbers) {
// write code here
const int len=numbers.size();
vector<int> a(len);
for(int i=0;i<len;i++){
a[numbers[i]]++;
if(a[numbers[i]]>1) return numbers[i];
}
return -1;
}
};
Clever solution (using the range of 0 to n-1)
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param numbers int整型vector
* @return int整型
*/
int duplicate(vector<int>& numbers) {
// write code here
int ret=-1;
int length=numbers.size();
for(int i=0;i<length;i++){
while(numbers[i]!=i){
if(numbers[i]==numbers[numbers[i]])
return numbers[i];
else
swap(numbers[i],numbers[numbers[i]]);
}
}
return ret;
}
};
Take the example question as an example to analyze the process of ingenious solution
2 3 1 0 2 5 3
2!=0
numbers[0]=2 != numbers[2]=1
so the sequence becomes
1 3 2 0 2 5 3
1!=0
numbers[0]=1 != numbers[ 1]=3
so the sequence becomes
3 1 2 0 2 5 3
3!=0
numbers[0]=3 != numbers[3]=0
so the sequence becomes
0 1 2 3 2 5 3
i++,i=1;
numbers[1]=1;
i++,i=2;
numbers[2]=2;
i++,i=3;
numbers[3]=3;
i++,i=4;
numbers[4]=2!=4;
numbers[4]=2 == numbers[2]=2
return numbers[4]=2;
Got a duplicate number!