229 Majority Element II 求众数 II
给定一个大小为 n 的数组,找出其中所有出现超过 ⌊ n/3 ⌋ 次的元素。 你的算法应该在O(1)空间中以线性时间运行。
详见:https://leetcode.com/problems/majority-element-ii/description/
摩尔投票法 Moore Voting
Java实现:
class Solution { public List<Integer> majorityElement(int[] nums) { List<Integer> res=new ArrayList<Integer>(); if(nums==null||nums.length==0){ return res; } int a=nums[0],cnta=0; int b=nums[0],cntb=0; for (int num : nums) { if (num == a) { ++cnta; }else if(num == b) { ++cntb; }else if(cnta == 0) { a = num; cnta=1; }else if(cntb == 0) { b = num; cntb=1; }else{ --cnta; --cntb; } } cnta=0; cntb=0; for(int num:nums){ if(num==a){ ++cnta; }else if(num==b){ ++cntb; } } if(cnta>nums.length/3){ res.add(a); } if(cntb>nums.length/3){ res.add(b); } return res; } }
C++实现:
class Solution { public: vector<int> majorityElement(vector<int>& nums) { vector<int> res; int m = 0, n = 0, cm = 0, cn = 0; for (auto &a : nums) { if (a == m) { ++cm; } else if (a ==n) { ++cn; } else if (cm == 0) { m = a, cm = 1; } else if (cn == 0) { n = a, cn = 1; } else { --cm, --cn; } } cm = cn = 0; for (auto &a : nums) { if (a == m) { ++cm; } else if (a == n) { ++cn; } } if (cm > nums.size() / 3) { res.push_back(m); } if (cn > nums.size() / 3) { res.push_back(n); } return res; } };
参考:https://www.cnblogs.com/grandyang/p/4606822.html