国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

Leetcode 169 - Majority Element(Moore投票算法)

2019-11-08 19:54:15
字體:
來源:轉載
供稿:網友

題意

給一個數組,求它的majority,對majority的定義為:出現次數超過?n2?的元素。

思路

算法1

O(nlogn)時間。

排序,然后返回中間的那個元素即可。

算法2

O(n)時間和O(n)空間。

我們用unordered_map來存儲每個元素出現的次數,最后返回出現次數超過?n2?的元素即可。

算法3

我們能否將空間繼續優化到const呢?答案是肯定的。

假設我們令我們的majority元素的數目為y,其他元素的個數為x,因為y>?n2?。所以,一定有y?x>0。也就是說:平均情況下,至少每兩個數會出現一個y。

那么,我們可以用一個cnt來記錄y出現的次數,但是此時我們并不知道y是多少?那么我們假設任意一個元素z為我們的majority,然后此時的cnt記為1。然后繼續去遍歷數組,假設當前遇到的元素為x

如果x=z: cnt++如果x≠z: cnt–: 當我們發現cnt為-1的時候,說明在目前長度下,z并不是我們的majority。那么用x去替換z。

最后得到的z就是我們的majority。

然后剛剛查了一下,發現這個算法叫做Moore投票算法

代碼

//algorithm 1class Solution {public: int majorityElement(vector<int>& nums) { //O(nlogn) time sort(nums.begin(), nums.end()); //the begin position is 0, so don't need to add 1 return nums[nums.size() >> 1]; }};//algorithm 2//O(n) time and O(n) spaceclass Solution {public: int majorityElement(vector<int>& nums) { unordered_map<int, int> count; for (auto x : nums) { count[x]++; //more than floor(n / 2), so should > if (count[x] > (nums.size() >> 1)) return x; } return 0; }};//algorithm 3//O(n) time and O(1) spaceclass Solution {public: int majorityElement(vector<int>& nums) { int cnt = 0, y = nums[0]; for (auto x : nums) { if (x == y) cnt++; else { cnt--; if (cnt == -1) y = x, cnt = 1; } } return y; }};
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 郯城县| 皋兰县| 海兴县| 鄂州市| 新宁县| 会泽县| 商河县| 永川市| 六安市| 茌平县| 呼玛县| 库伦旗| 莆田市| 双流县| 利川市| 盐源县| 广昌县| 贵南县| 六盘水市| 澄江县| 循化| 南丰县| 朔州市| 上思县| 盘锦市| 九江县| 沂源县| 忻城县| 平乐县| 化州市| 泸西县| 吐鲁番市| 临沧市| 贵南县| 湾仔区| 白水县| 磐安县| 隆昌县| 通山县| 贞丰县| 板桥市|