zoukankan      html  css  js  c++  java
  • 229 Majority Element II 求众数 II

    给定一个大小为 n 的数组,找出其中所有出现超过 ⌊ n/3 ⌋ 次的元素。 你的算法应该在O(1)空间中以线性时间运行。

    详见:https://leetcode.com/problems/majority-element-ii/description/

    摩尔投票法 Moore Voting

    Java实现:

    class Solution {
        public List<Integer> majorityElement(int[] nums) {
            List<Integer> res=new ArrayList<Integer>();
            if(nums==null||nums.length==0){
                return res;
            }
            int a=nums[0],cnta=0;
            int b=nums[0],cntb=0;
            for (int num : nums) {
                if (num == a) {
                    ++cnta;
                }else if(num == b) {
                    ++cntb;
                }else if(cnta == 0) {
                    a = num;
                    cnta=1;
                }else if(cntb == 0) {
                    b = num;
                    cntb=1;
                }else{
                    --cnta;
                    --cntb;
                }
            }
            cnta=0;
            cntb=0;
            for(int num:nums){
                if(num==a){
                    ++cnta;
                }else if(num==b){
                    ++cntb;
                }
            }
            if(cnta>nums.length/3){
                res.add(a);
            }
            if(cntb>nums.length/3){
                res.add(b);
            }
            return res;
        }
    }
    

     C++实现:

    class Solution {
    public:
        vector<int> majorityElement(vector<int>& nums) {
            vector<int> res;
            int m = 0, n = 0, cm = 0, cn = 0;
            for (auto &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 (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;
        }
    };
    

    参考:https://www.cnblogs.com/grandyang/p/4606822.html

  • 相关阅读:
    ubuntu问题集锦
    得把这个事情坚持下来
    海贼王有啥好看的?
    虚拟机网络连不上怎么办?
    耍耍Windows Live Writer
    Jquey模糊选择
    JS网址正则验证
    PowerDesigner 同步Name到Comment 及 同步 Comment 到Name
    进程调用系统默认和邮件客户端并附加指定文件
    Form.DialogResult 属性
  • 原文地址:https://www.cnblogs.com/xidian2014/p/8758768.html
Copyright © 2011-2022 走看看