題目:找到給定數組中出現次數大於長度一半的數字,若沒有,則返回0。
思路:
第一種方法:直接利用map<int,int>其中第一個元素存放數組中出現的元素種類,第二個元素存放相對應元素出現的次數。
最後進行檢查,判斷是否有次數大於數組長度的一半。
這種方法的優點是簡單容易理解,缺點是需要申請內存空間O(n)。
第二種方法:這種方法的思路是這樣的:每次“刪除”兩個不同的元素,最後剩下的那個元素纔可能是我們需要的結果,若剩下元素是不存在的,那麼就是不存在。這種方法只需要申請O(1)的內存空間。
程序1:第一種方法:
class Solution {
public:int MoreThanHalfNum_Solution(vector<int> numbers) {
if(numbers.empty()) return 0;
map<int,int> temp;
for(int i=0;i<numbers.size();i++){
if(temp.find(numbers[i])!=temp.end()){
temp[numbers[i]]++;
}
else{
temp[numbers[i]]=1;
}
}
for(map<int,int>::iterator start=temp.begin();start!=temp.end();start++){
if(start->second>numbers.size()/2){
return start->first;
break;
}
}
return 0;
}
};
程序2:第二種方法:
class Solution {
public:
int MoreThanHalfNum_Solution(vector<int> numbers) {
if(numbers.size()==0) return 0;
int ele=numbers[0];
map<int,int> temp;
temp[ele]=1;
for(int i=1;i<numbers.size();i++){
if(ele==numbers[i]){
temp[ele]++;
}
else if(temp[ele]==1){
if(++i<numbers.size()){
ele=numbers[i];
temp[ele]=1;
}
else
return 0;
}
}
int count=0;//注,這裏的count是必須的,用於記錄出現次數最多的那個元素的次數,當有一個元素和它不一樣時,就進行-1,若最後它的值爲0,那麼需要重新更新新的元素。
for(int i=0;i<numbers.size();i++){
if(numbers[i]==ele){
count++;
if(count>numbers.size()/2)
return ele;
}
}
return 0;
}
};