方法1
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param numbers int整型vector
* @return int整型
*/
int duplicate(vector<int>& numbers) {
int len = numbers.size();//获取数组长度
//如果数组中有超出界限(0 - len - 1)的数则return -1
for (int i = 0; i < len; i++){
if (numbers[i] < 0 || numbers[i] >= len){
return -1;
}
}
for (int i = 0; i < len; i++){
//如果下标i上的数不等于对应的下标i 且 下标i上的数字(把他当做下标)对应的数组的数不等于该数(下标),则交换,否则跳过
while (i != numbers[i] && numbers[numbers[i]]!=numbers[i]){
swap(numbers[i], numbers[numbers[i]]);
}
//如果下标i上的数不等于对应的下标i但是下标i上的数字(把他当做下标)对应的数组的数等于该数(下标),说明是相同的两个数字(重复)
if (i != numbers[i] && numbers[i] == numbers[numbers[i]]){
return numbers[i];
}
}
return -1;
}
};
方法2
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param numbers int整型vector
* @return int整型
*/
// int duplicate(vector<int>& numbers) {
// int len = numbers.size();
// for (int i = 0; i < len; i++){
// if (numbers[i] < 0 || numbers[i] >= len){
// return -1;
// }
// }
// for (int i = 0; i < len; i++){
// while (i != numbers[i] && numbers[numbers[i]]!=numbers[i]){
// swap(numbers[i], numbers[numbers[i]]);
// }
// if (i != numbers[i] && numbers[i] == numbers[numbers[i]]){
// return numbers[i];
// }
// }
// return -1;
// }
//类桶排序的思想 额外再需开创数组
int duplicate(vector<int>& numbers) {
int len = numbers.size();
vector<int> bucket(len, 0);
for (int i = 0; i < len; i++){
if (numbers[i] < 0 || numbers[i] >= len){
return -1;
}
}
for (int i = 0; i < len; i++){
bucket[numbers[i]]++;
}
for (int i = 0; i < len; i++){
if (bucket[i]>1) return i;
}
return -1;
}
};