solution_229

来源:互联网 发布:淘宝宝贝权重怎么看 编辑:程序博客网 时间:2024/06/11 15:26

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.

image

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;}
原创粉丝点击