zoukankan      html  css  js  c++  java
  • LeetCode——169.多数元素难度

    给定一个大小为 n 的数组,找到其中的多数元素。多数元素是指在数组中出现次数大于 ⌊ n/2 ⌋ 的元素。

    你可以假设数组是非空的,并且给定的数组总是存在多数元素。

    示例 1:
    
    输入: [3,2,3]
    输出: 3
    
    示例 2:
    
    输入: [2,2,1,1,1,2,2]
    输出: 2
    

    https://leetcode-cn.com/problems/majority-element

    摩尔投票法

    先将第一个数字假设为过半数,然后把计数器设为1,比较下一个数和此数是否相等,若相等则计数器加一,反之减一。

    然后看此时计数器的值,若为零,则将下一个值设为候选过半数。

    以此类推直到遍历完整个数组,当前候选过半数即为该数组的过半数。

    C++

    class Solution {
    public:
        int majorityElement(vector<int>& nums) {
            int res = 0, cnt = 0;
            for (int num : nums) {
                if (cnt == 0) {res = num; ++cnt;}
                else (num == res) ? ++cnt : --cnt;
            }
            return res;
        }
    }; 
    

    Java

    public class Solution {
        public int majorityElement(int[] nums) {
            int res = 0, cnt = 0;
            for (int num : nums) {
                if (cnt == 0) {res = num; ++cnt;}
                else if (num == res) ++cnt;
                else --cnt;
            }
            return res;
        }
    } 
    

    位操作

    将这个大多数按位来建立,从0到31位,每次统计下数组中该位上0和1的个数,如果1多,那么将结果 res 中该位变为1,最后累加出来的 res 就是过半数了,参见代码如下:

    C++

    class Solution {
    public:
        int majorityElement(vector<int>& nums) {
            int res = 0, n = nums.size();
            for (int i = 0; i < 32; ++i) {
                int ones = 0, zeros = 0;
                for (int num : nums) {
                    if (ones > n / 2 || zeros > n / 2) break;
                    if ((num & (1 << i)) != 0) ++ones;
                    else ++zeros;
                }
                if (ones > zeros) res |= (1 << i);
            }
            return res;
        }
    }; 
    

    Java

    public class Solution {
        public int majorityElement(int[] nums) {
            int res = 0, n = nums.length;
            for (int i = 0; i < 32; ++i) {
                int ones = 0, zeros = 0;
                for (int num : nums) {
                    if (ones > n / 2 || zeros > n / 2) break;
                    if ((num & (1 << i)) != 0) ++ones;
                    else ++zeros;
                }
                if (ones > zeros) res |= (1 << i);
            }
            return res;
        }
    }
    
  • 相关阅读:
    无线网络安全一瞥
    静态代码分析与代码质量安全
    构建移动应用测试(一)
    移动应用App测试与质量管理一
    企业商务差旅信息化管理与移动App
    身份管理系统与解决方案
    微信指数是怎么调取数据来源的
    微信正式上线“微信指数”,基于微信大数据分析的移动端指数
    新版微信小程序即将上线 新增微信支付功能
    微信公众号留言置顶功能上线
  • 原文地址:https://www.cnblogs.com/wwj99/p/12484451.html
Copyright © 2011-2022 走看看