找到給定數組中出現次數大於長度一半的數字,若沒有,則返回0

題目:找到給定數組中出現次數大於長度一半的數字,若沒有,則返回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;
    }
};

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章