剑指offer第五十题
题目如下
思路与代码
直接map查询
这种思路在前面已经用过很多次了
…都无语了,这题显然没有用到0到n-1这个条件
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;
}
};
稍微提升一点,vector不用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;
}
};
巧解(用到了0到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;
}
};
以例题为例,分析巧解过程
2 3 1 0 2 5 3
2!=0
numbers[0]=2 != numbers[2]=1
所以序列变为
1 3 2 0 2 5 3
1!=0
numbers[0]=1 != numbers[1]=3
所以序列变为
3 1 2 0 2 5 3
3!=0
numbers[0]=3 != numbers[3]=0
所以序列变为
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;
得到了重复的数字!