zoukankan      html  css  js  c++  java
  • [LeetCode] Majority Element II

    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;
        }
    }
  • 相关阅读:
    二 web爬虫,scrapy模块以及相关依赖模块安装
    一 web爬虫,requests请求
    Linux 常用命令大全
    HTTP响应状态码参考
    python-进程,线程,协程
    SVN图形管理工具-Submint
    python-Socket网络编程
    python基础-pickle与shelve
    python-面向对象
    10分钟看懂, Java NIO 底层原理
  • 原文地址:https://www.cnblogs.com/brucemengbm/p/7116940.html
Copyright © 2011-2022 走看看