码迷,mamicode.com
首页 > 其他好文 > 详细

[LeetCode] Majority Element II

时间:2017-07-04 16:06:51      阅读:129      评论:0      收藏:0      [点我收藏+]

标签:function   ade   markdown   article   new   keyword   find   append   实现   

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

标签:function   ade   markdown   article   new   keyword   find   append   实现   

原文地址:http://www.cnblogs.com/brucemengbm/p/7116940.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!