博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[LeetCode] Majority Element 求众数
阅读量:6319 次
发布时间:2019-06-22

本文共 2043 字,大约阅读时间需要 6 分钟。

Given an array of size n, find the majority element. The majority element is the element that appears more than ⌊ n/2 ⌋ times.

You may assume that the array is non-empty and the majority element always exist in the array.

Credits:

Special thanks to  for adding this problem and creating all test cases.

这是到求众数的问题,有很多种解法,可参见网友,其中我感觉比较好的有两种,一种是用哈希表,这种方法需要O(n)的时间和空间,另一种是用一种叫摩尔投票法 Moore Voting,需要O(n)的时间和O(1)的空间,比前一种方法更好。这种投票法先将第一个数字假设为众数,然后把计数器设为1,比较下一个数和此数是否相等,若相等则计数器加一,反之减一。然后看此时计数器的值,若为零,则将当前值设为候选众数。以此类推直到遍历完整个数组,当前候选众数即为该数组的众数。代码如下:

C++ 解法一:

class Solution {public:    int majorityElement(vector
& 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;    }}

下面这种解法利用到了位操作Bit Manipulation来解,将中位数按位来建立,从0到31位,每次统计下数组中该位上0和1的个数,如果1多,那么我们将结果res中该位变为1,最后累加出来的res就是中位数了,相当赞的方法,这种思路尤其在这道题的延伸中有重要的应用,参见代码如下:

C++ 解法二:

class Solution {public:    int majorityElement(vector
& nums) { int res = 0; for (int i = 0; i < 32; ++i) { int ones = 0, zeros = 0; for (int num : nums) { 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;        for (int i = 0; i < 32; ++i) {            int ones = 0, zeros = 0;            for (int num : nums) {                if ((num & (1 << i)) != 0) ++ones;                else ++zeros;            }            if (ones > zeros) res |= (1 << i);        }        return res;    }}

本文转自博客园Grandyang的博客,原文链接:,如需转载请自行联系原博主。

你可能感兴趣的文章
spring技术内幕读书笔记之IoC容器的学习
查看>>
自动生成四则运算题目
查看>>
Android学习系列(5)--App布局初探之简单模型
查看>>
git回退到某个历史版本
查看>>
HTML5基础(二)
查看>>
ue4(c++) 按钮中的文字居中的问题
查看>>
Hadoop日记Day1---Hadoop介绍
查看>>
Android学习笔记——文件路径(/mnt/sdcard/...)、Uri(content://media/external/...)学习
查看>>
Echart:前端很好的数据图表展现工具+demo
查看>>
Linux VNC黑屏(转)
查看>>
Java反射简介
查看>>
day8--socket网络编程进阶
查看>>
node mysql模块写入中文字符时的乱码问题
查看>>
分析Ajax爬取今日头条街拍美图
查看>>
内存分布简视图
查看>>
如何学习虚拟现实技术vr? vr初级入门教程开始
查看>>
第4 章序列的应用
查看>>
初识闭包
查看>>
hdu1874畅通工程续
查看>>
rails 字符串 转化为 html
查看>>