找到给定数组中出现次数大于长度一半的数字,若没有,则返回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;
    }
};

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