国产探花免费观看_亚洲丰满少妇自慰呻吟_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; }};
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 平南县| 唐河县| 维西| 湛江市| 类乌齐县| 岳池县| 曲沃县| 宁城县| 六安市| 阳山县| 张北县| 收藏| 崇州市| 锡林浩特市| 福安市| 吴江市| 礼泉县| 通河县| 漠河县| 潍坊市| 定陶县| 钦州市| 双牌县| 隆林| 黔西县| 米脂县| 伊金霍洛旗| 渭南市| 拉萨市| 顺平县| 桦川县| 喀喇沁旗| 白城市| 克拉玛依市| 荃湾区| 东台市| 曲靖市| 剑阁县| 隆林| 永仁县| 平舆县|