LeetCode Problem 229 Description
Given an integer array of size n, find all elements that appear more than ⌊ n/3 ⌋
times. The algorithm should run in linear time and in O(1) space.
Solution
This problem is familiar to the LeetCode problem 169 and I think we can use the Boyer-Moore algorithm to solve it.
Since the problem require for ⌊ n/3 ⌋
times, we can set up two elements to be the major element group to make sure that we can get the element we want because there are at most 2 elements that appear more than⌊ n/3 ⌋
times. And the following code can make sure that the elements that appear the most times must be in the group we get at last.
#include <iostream>
#include <string>
#include <vector>
using namespace std;
class Solution {
public:
vector<int> majorityElement(vector<int> & nums);
};
vector<int> Solution::majorityElement(vector<int> & nums) {
//Boyer-Moore algorithm
int major1, major2, count1 = 0, count2 = 0;
vector<int> result;
for (int i = 0; i < nums.size(); i++){
if (major1 == nums[i]) {
count1++;
}
else if (major2 == nums[i]) {
count2++;
}
else if (count1 == 0) {
major1 = nums[i];
count1++;
}
else if (count2 == 0) {
major2 = nums[i];
count2++;
}
else {
count1--;
count2--;
}
}
count1 = 0;
count2 = 0;
for (int i = 0; i < nums.size(); i++) {
if (nums[i] == major1) {
count1++;
}
if (nums[i] == major2) {
count2++;
}
}
if (count1 > nums.size() / 3) {
result.push_back(major1);
}
if (count2 > nums.size() / 3) {
result.push_back(major2);
}
return result;
}