给定一个大小为 n 的数组,找出其中所有出现超过 ⌊ n/3 ⌋ 次的元素。

说明: 要求算法的时间复杂度为 O(n),空间复杂度为 O(1)。

解法:Boyer-Moore投票法

相似题目:169. 多数元素

class Solution {
 public:
  vector<int> majorityElement(vector<int>& nums) {
    vector<int> result;
    if (nums.empty()) return result;
    int candidate1 = nums[0], count1 = 0;
    int candidate2 = nums[0], count2 = 0;

    for (int num : nums) {
      if (candidate1 == num) {
        count1++;
      } else if (candidate2 == num) {
        count2++;
      } else if (count1 == 0) {
        candidate1 = num;
        count1++;
      } else if (count2 == 0) {
        candidate2 = num;
        count2++;
      } else {
        count1--;
        count2--;
      }
    }

    count1 = 0;
    count2 = 0;
    for (int num : nums) {
      if (candidate1 == num)
        count1++;
      else if (candidate2 == num)
        count2++;
    }

    if (count1 > nums.size() / 3) result.push_back(candidate1);
    if (count2 > nums.size() / 3) result.push_back(candidate2);
    return result;
  }
};