寻找多数元素这一问题主要运用了:Majority Vote Alogrithm(最大投票算法)
1.Majority Element

1)description

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.

注意3点:这里的多数元素必须严格大于⌊ n/2 ⌋(向下取整)、题目假定数组非空、假定最大元素一定存在(并且我们可以知道满足要求的元素仅1个)。

eg:[1,2,7,2,2,5,10,2,2]   n=9  最多数元素为2,因为它出现次数为5>⌊ 9/2 ⌋=4.

     2)solutions

链接中有leetcoder的六种方案,例如最直观的哈希表:map遍历时通过对相同数组元素逐一累加可以筛选出满足条件的元素,这一方案对Majority Element II也适用;或者通过对数组先排序,那么取出数组索引为⌊ n/2 ⌋的元素即可;又有随机抽取数组中的元素然后求其出现次数,由于最多数元素为⌊ n/2 ⌋个,所以最糟情况下猜了⌊ n/2 ⌋次;分治法;最大投票算法。

3)最大投票算法原理:

遍历数组,当碰到两个不一样的数字时,将这两个数字同时丢弃,这两个数字中可能有一个为 Majority Element,也可能两个都不为Majority Element.因为k 大于 n/2,所以在最差情况下(每次移除不同数字时都包含一个Majority Element),我们仍然能够保证最后得到的数字是Majority Element.总之:在原序列中去除两个不同的元素后,在原序列中的多数元素在新序列中还是多数元素

根据《算法设计技巧与分析》书中的算法可以写出如下非递归代码(书中为递归版本并且附有检查候选的最多数元素是否存在):

class Solution {
public:
int majorityElement(vector<int>& nums) {
int j,candidate,count; //candidate代表候选解即最多数元素,count代表票数
for (j = ; j < nums.size(); j++){
candidate = nums[j]; count = ; //起初假定第一个元素即为candidate且票数为1,当票数count=0时就换candidate
while (j < nums.size() - && count>){
j = j + ;
if (nums[j] == candidate) count++; //当下一个元素与candidate相等时票数+1
else count--; //否则票数-1
}
}
return c;
}
};

下面代码和上面完全一样,只是更直观一点:

class Solution {
public:
int majorityElement(vector<int>& nums) {
int candidate, count = , n = nums.size();
for (int i = ; i < n; i++) {
if (count==) { //票数为0则换candidate,换了candidate票数就得变为1
candidate = nums[i];
count = ;
}
else if(nums[i] == candidate) //下一个元素和candidate相等时票数+1
count++;
else
count--; //不相等票数-1
}
return candidate;
}
};

总结:因为数组个数为n,且最多数元素个数>⌊ n/2 ⌋,所以有且只有1个元素满足条件,所以设置了一个candidate和一个计票器count。而 Majority Element II要求是最多数元素个数>⌊ n/3 ⌋,所以至多有2个元素满足要求,所以需要设置两个candidate和两个计票器count

2.Majority Element II

1)description: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.

2)思路:我们需要找到三个不同的数字,然后抛弃掉这三个数字:首先要判断是否等于candidate,如果等于candidate那么对应的 candidate 必须加一等待其他的数字来消除它,当有一个 candidate 的 count 为 0 时,说明该 candidate 已经全部被消除,我们需要设定新的 candidate 数字。当一个数字不等于两个 candidate,同时两个 candidate 的 count 都不为零。这意味着当前这个数字就是这两个candidate 等待的第三个数字。于是这三个数字被移除,同时它们的的 count 都要减一。

eg:[2,1,1,4,6,1,10]       n=7   元素1的个数为3>⌊ 7/3 ⌋=2

[2,1,1,1,10,2,2,1]    n=8   元素1个数为4>⌊ 8/3 ⌋=2,元素2的个数为3>⌊ 8/3 ⌋=2

python代码:

class Solution(object):
def majorityElement(self, nums):
"""
:type nums: List[int]
:rtype: List[int]
"""
if not nums:
return []
count1, count2, candidate1, candidate2 = , , , 0 //初始化两个candidate和两个count
for n in nums:
if n == candidate1: //注意这里的元素值相等和count为0的判断顺序与问题一中正好相反
count1 += 1 //这里先判断元素值与candidate是否相等
elif n == candidate2:
count2 +=
elif count1 == : //再判断count是否为0
candidate1, count1 = n,
elif count2 == :
candidate2, count2 = n,
else:
count1, count2 = count1 - , count2 -
return [n for n in (candidate1, candidate2) if nums.count(n) > len(nums) // 3]

参考:segmentFault

Majority Element(169) && Majority Element II(229)的更多相关文章

  1. leetcode 169. Majority Element 、229. Majority Element II

    169. Majority Element 求超过数组个数一半的数 可以使用hash解决,时间复杂度为O(n),但空间复杂度也为O(n) class Solution { public: int ma ...

  2. LeetCode Javascript实现 169. Majority Element 217. Contains Duplicate(两个对象比较是否相等时,如果都指向同一个对象,a==b才是true)350. Intersection of Two Arrays II

    169. Majority Element /** * @param {number[]} nums * @return {number} */ var majorityElement = funct ...

  3. LeetCode(169)Majority Element and Majority Element II

    一个数组里有一个数重复了n/2多次,找到 思路:既然这个数重复了一半以上的长度,那么排序后,必然占据了 a[n/2]这个位置. class Solution { public: int majorit ...

  4. 169. Majority Element 出现次数超过n/2的元素

    [抄题]: Given an array of size n, find the majority element. The majority element is the element that ...

  5. [LeetCode] 169. Majority Element 多数元素

    Given an array of size n, find the majority element. The majority element is the element that appear ...

  6. 【LeetCode】169. Majority Element 解题报告(Java & Python & C+)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 思路 hashmap统计次数 摩尔投票法 Moore ...

  7. 169. Majority Element(C++)

    169. Majority Element Given an array of size n, find the majority element. The majority element is t ...

  8. 23. leetcode 169. Majority Element

    169. Majority Element Given an array of size n, find the majority element. The majority element is t ...

  9. Leetcode#169. Majority Element(求众数)

    题目描述 给定一个大小为 n 的数组,找到其中的众数.众数是指在数组中出现次数大于 ⌊ n/2 ⌋ 的元素. 你可以假设数组是非空的,并且给定的数组总是存在众数. 示例 1: 输入: [3,2,3] ...

随机推荐

  1. 【Gym - 101164I】Cubes(dfs,剪枝)

    BUPT2017 wintertraining(15) #4 A - I.Cubes Gym - 101164I 题意 将n拆成最少个立方数相加的形式. 题解 根据n的范围,立方数最大不超过400的立 ...

  2. 述 SQL 中的 distinct 和 row_number() over() 的区别及用法

    1 前言 在咱们编写 SQL 语句操作数据库中的数据的时候,有可能会遇到一些不太爽的问题,例如对于同一字段拥有相同名称的记录,我们只需要显示一条,但实际上数据库中可能含有多条拥有相同名称的记录,从而在 ...

  3. 自学工业控制网络之路1.3-典型的现场总线介绍FF

    返回 自学工业控制网络之路 自学工业控制网络之路1.3-典型的现场总线介绍FF 1994年6月,ISP和WORLDFIP合并成立现场总线基金会FF.1998年,FF基金会开发了HSE 10/100Mb ...

  4. 自学Linux Shell3.1-帮助命令man

    点击返回 自学Linux命令行与Shell脚本之路 3.1-帮助命令man 1.man命令概述 默认bash shell提示符是美元符号($),这个符号表明shell在等待用户输入. Linux ma ...

  5. django restframework Serializers

    序列化器允许将诸如查询集和模型实例之类的复杂数据转换为原生 Python 数据类型,然后可以将它们轻松地呈现为 JSON,XML 或其他内容类型.序列化器还提供反序列化,在首次验证传入数据之后,可以将 ...

  6. intent-filter 之 data 「scheme, host, port, mimeType, path, pathPrefix, pathPattern」

    之前一直搞不很明白 AndroidManifest.xml 中 activity 标签下的 intent-filter 中 data 标签的属性含义,今天认真看了 Dev Guide,又在网上查询了大 ...

  7. 树莓派上使用mdk3对无线热点进行DoS攻击

    写在前面 你必须确保你的无线网卡支持监听模式(混淆模式),树莓派板载的无限网卡是不支持的.所以你必须额外安装一个支持监听模式的USB无线网卡. 安装mdk3 安装sudo apt install md ...

  8. [luogu3197][越狱]

    luogu3197 思路 看了很久没思路,看了题解发现自己好zz.用全部的情况减去不合法的情况就行了.全部的情况就是每个人随便选,总共有\(m^n\)种情况,然后考虑不合法的情况,也就是任意相邻的两个 ...

  9. My thoughts after NOIP 2018(1)

    联赛就这样结束了. 感觉真是奇怪啊.以前看重的东西,像是忽然扔下的包袱,一下子轻了. 而我一直在逃避的,不愿直面的东西,果然终于还是要再次面对了啊. 文化课百废待兴,\(noip\)的最终结果依然未知 ...

  10. 源码研究:php变量

    一:php中的变量类型 1.标量类型:布尔型 bool,整型 int,浮点型 float,字符串型 string2.复杂类型:数组 array,对象 object3.特殊类型:NULL,资源 reso ...