169-多數元素

169-多數元素

1.題目

LeetCode-169-多數元素c++

給定一個大小爲 n 的數組,找到其中的多數元素。多數元素是指在數組中出現次數大於 ⌊ n/2 ⌋ 的元素。
你能夠假設數組是非空的,而且給定的數組老是存在多數元素。算法

2.標準答案

LeetCode-169-多數元素-官方題解數組

暴力求解 O(n^2)函數

哈希函數 O(n)code

數學方法內存

3.心得

這道題說白了就是求衆數(並且限定好了很是舒服的條件範圍)。
通常初見這題,初學者都會直接想到暴力解法,很少BB。
作了必定數量的簡單題後,很容易會想到哈希表(好比我),可是哈希表會存在一個問題,就是會有額外的內存佔用。
我一開始的想法是用邏輯運算去作,發現此路不通,查題解發現了一個利用題目要求的數學性質作的—Boyer-Moore 投票算法。element

想法

若是咱們把衆數記爲 +1+1 ,把其餘數記爲 -1−1 ,將它們所有加起來,顯然和大於 0 ,從結果自己咱們能夠看出衆數比其餘數多。
即:在原序列中去除兩個不一樣的元素後,原序列中的多數元素在新序列中仍是多數元素。leetcode

算法

1)將數組的第一個元素設置爲多數元素P,並記錄count = 1
2)將數組後面的數與P比較,若相等count+1,不相等count-1
3)若count減到0,便表示該元素出現次數太少,將其和後面一個不相等的元素剔除,再次重置c和count
4)繼續此操做,直到比較到最後count都不爲0,則c就爲多數元素。get

class Solution {
public:
    int majorityElement(vector<int>& nums) {
        if(nums.size()==0||nums.size()==1) return nums[0];
        vector<int>::iterator iter=nums.begin();
        int last=*iter,cnt=0;
        iter++;
        while(iter!=nums.end())
        {
            if(cnt!=0)
            {
                if(*iter==last) cnt++;
                else cnt--;
            }
            else
            {
                if(*iter==last) cnt++;
                else last=*iter;
            }
            iter++;
        }
        return last;
    }
};
相關文章
相關標籤/搜索