劍指offer刷題————數組中出現次數超過一半的數字

問題重述:

題目:數組中有一個數字出現的次數超過數組長度的一般,請找出這個數字。不存在則返回0.例如輸入一個長度爲9的數組{1,2,3,2,2,2,5,4,2}。由於數字2在數組中出現了5次,超過數組長度的一半,因此輸出2。

思路解析:

數組中有一個數字出現的次數超過了數組長度的一半,也就是說它出現的次數比其他所有的數字出現的次數和還要多。因此我們可以卡奧率在遍歷數組的時候保存兩個值;一個是數組中的一個數字,一個是次數。

當我們遍歷到下一個數字的時候,如果下一個數字和我們之前保存的數字相同,則次數加1,否則次數減1.如果次數爲0,我們需要保存下一個數字,並將次數設置爲1.由於我們要找的數字出現的次數比其他所有數字出現的次數之和還要多,那麼要找的數字肯定是最後依次把次數設置爲1的數字。即遍歷完之後我們保存的數字。

在遍歷完之後,我們還要進行一次判斷,判斷我們保存的數字是不是滿足超過長度的一半。

代碼實現:

class Solution {
public:
    int MoreThanHalfNum_Solution(vector<int> numbers) {
        //輸入的有效性檢查
        if(numbers.size()<1)
            return 0;
        //遍歷序列
        int size = 1;
        int num = numbers[0];
        for(size_t i = 1;i<numbers.size();++i)
        {
            if(size==0)
            {
                num=numbers[i];
                size=1;
            }
            else  if(num==numbers[i])
                ++size;
            else 
                --size;
            
        }
        //看這個num的長度滿不滿足一半
        if(checkInvaild(numbers,num))
            return num;
        //滿足返回num
        return 0;
        
    }
    bool checkInvaild(vector<int> numbers,int num)
    {
        int len = 0;
        for(auto e:numbers)
        {
            if(e==num)
            {
                ++len;
            }
        }
        if(len*2>numbers.size())
            return true;
        return false;
    }
};

 

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