劍指offer——陣列中重複的數字C++
阿新 • • 發佈:2021-01-07
技術標籤:劍指Offer陣列演算法leetcode劍指offer
法1就是用map,如果map對應的值==1了就證明找到重複了。如果不為1,就對應的值++。
法2:高階法,因為所有數字的範圍是0到n-1,如果沒有重複,那麼每一位就在每一位的位置上,0就在0號位,1就在1號位。如果有重複,那麼就會發生搶位的情況。遍歷該陣列,如果在自己的位置上,就continue。如果不在,就判斷當前的值和它本來該放的位置的值是否相等,如果相等,那麼就是找到重複的了,直接return true。如果不等,就把它放回該放的位置,用swap即可。
#include<unordered_map>
class Solution {
public:
// Parameters:
// numbers: an array of integers
// length: the length of array numbers
// duplication: (Output) the duplicated number in the array number
// Return value: true if the input is valid, and there are some duplications in the array number
// otherwise false
bool duplicate(int numbers[], int length, int* duplication) {
//找重複,1是用map,2是用位運算(但是這裡不知道有幾個重複數字,所以不能位運算)
//3,是排序後依次比較
/*unordered_map<int,int> ma;
//直接迴圈到length也可
for(int i = 0; i < length; ++i){
if(ma[numbers[i]] == 1){
duplication[0] = numbers[i];
return true;
}
ma[numbers[i]]++;
}*/
for(int i = 0; i < length; ++i){
if(numbers[i] < 0 || numbers[i] > length-1) return false;
}
for(int i = 0; i < length; ++i){
//numbers[i] == i時證明這個數放回原來的位置了
//將它和它應該放的位置比較,如果不匹配,就讓它去該換的
//如果相同,證明找到了
if(numbers[i] == i) continue;
else if(numbers[i] == numbers[numbers[i]]){
*duplication = numbers[i];
return true;
}
else{
swap(numbers[i],numbers[numbers[i]]);
}
}
return false;
}
};