1. 程式人生 > >[LeetCode] Majority Element II

[LeetCode] Majority Element II

java end type cto div hat hide i++ pub

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.

解題思路

摩爾投票法。投票法的核心是找出兩個候選眾數進行投票,須要兩遍遍歷。第一遍歷找出兩個候選眾數,第二遍遍歷又一次投票驗證這兩個候選眾數是否為眾數就可以。

實現代碼

C++:

class Solution {
public:
    vector<int>
majorityElement(vector<int>& nums) { vector<int> res; int m = 0, n = 0, cm = 0, cn = 0; for (int i = 0; i < nums.size(); i++) { if (nums[i] == m) { cm++; } else if (nums[i] == n) { cn++; } else
if (cm == 0) { m = nums[i]; cm = 1; } else if (cn == 0) { n = nums[i]; 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; } };

Java:

public class Solution {
    public List<Integer> majorityElement(int[] nums) {
        List<Integer> res = new ArrayList<Integer>();
        int m = 0, n = 0, cm = 0, cn = 0;
        for (int 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 (int a : nums){
            if (a == m) {
                ++cm;
            } else if (a == n) {
                ++cn;
            }
        }

        if (cm > nums.length / 3) {
            res.add(m);
        }
        if (cn > nums.length / 3) {
            res.add(n);
        }

        return res;
    }
}

[LeetCode] Majority Element II