原题网址; https://www.lintcode.com/problem/majority-element-ii/

描述

给定一个整型数组,找到主元素,它在数组中的出现次数严格大于数组元素个数的三分之一。

数组中只有唯一的主元素

您在真实的面试中是否遇到过这个题?  是

样例

给出数组[1,2,1,2,1,3,3] 返回 1

挑战

要求时间复杂度为O(n),空间复杂度为O(1)。

查看标签

枚举法

贪心
 
思路:利用map,建立nums【i】与数量count 的映射,最后返回 count 大于元素个数三分之一的nums【i】。
 
AC代码:
class Solution {
public:
/*
* @param nums: a list of integers
* @return: The majority number that occurs more than 1/3
*/
int majorityNumber(vector<int> &nums) {
// write your code here
int n=nums.size();
map<int,int> m;
for (int i=;i<n;i++)
{
m.insert(pair<int,int>(nums[i],));
}
for (int i=;i<n;i++)
{
m[nums[i]]++;
}
for (int i=;i<n;i++)
{
if (m[nums[i]]>n/)
{
return nums[i];
}
}
}
};

另一种方法:摩尔投票法  可参照:摩尔投票法    https://blog.csdn.net/krystalhuang/article/details/71512901   以及 https://www.cnblogs.com/ZhangYushuang/p/4627503.html

思路:

1,   超过n/3的元素个数最多两个

2,   数组中连续3个数据为一组的话,一共n/3组,那么如果存在符合条件的元素,这个元素一定出现在某一个组内至少两次

3,   知道了以上两个条件后,用所谓的摩尔投票法,共两轮,

第一轮:找出出现次数最多的两个元素,每次存储两个元素n1和n2【注意n1 != n2】,如果第三个元素与其中一个相同,则增加计数cn1或cn2,  否则,清除n1和n2,从下一个数据开始重新统计.

根据第二条,数目较多的元素一定可以被查到,当然查到的不一定是大于n/3的.【有可能是连续3个为一组某个数字出现两~三次】

第二轮:验证这两个元素是否满足条件,即出现的次数是否大于n/3;

 AC代码:
class Solution {
public:
/*
* @param nums: a list of integers
* @return: The majority number that occurs more than 1/3
*/
int majorityNumber(vector<int> &nums) {
// write your code here
int n=nums.size();
int candidate1,candidate2,count1=,count2=;
for (int i=;i<n;i++)
{
if (count1==)
{
candidate1=nums[i];
count1=;
}
else if (count2==&&nums[i]!=candidate1) //注意此处的nums[i]!=candidate1,两个candidate不能是同一个数;
{
candidate2=nums[i];
count2=;
}
else if (nums[i]==candidate1)
{
count1++;
}
else if (nums[i]==candidate2)
{
count2++;
}
else
{
count1--;
count2--;
}
} count1=count2=;
for (int i=;i<n;i++)
{
if (nums[i]==candidate1)
{
count1++;
}
if (nums[i]==candidate2)
{
count2++;
}
} if (count1>n/)
{
return candidate1;
}
if (count2>n/)
{
return candidate2;
}
}
};
 
 此外,九章算法上也给出了本题的代码:https://www.jiuzhang.com/solutions/majority-number-ii/#tag-highlight-lang-cpp
 
该代码在lintcode网站上可以通过,但是放在VS2010下运行出错,原因是 candidate1 与 candidate2 未初始化,想不明白原因啊,费解。

47 Majority Element II的更多相关文章

  1. 47.Majority Element I & II

    Majority Element I 描述 给定一个整型数组,找出主元素,它在数组中的出现次数严格大于数组元素个数的二分之一. You may assume that the array is non ...

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

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

  3. Majority Element,Majority Element II

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

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

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

  5. Majority Element(169) && Majority Element II(229)

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

  6. 【LeetCode】229. Majority Element II

    Majority Element II Given an integer array of size n, find all elements that appear more than ⌊ n/3 ...

  7. LeetCode169 Majority Element, LintCode47 Majority Number II, LeetCode229 Majority Element II, LintCode48 Majority Number III

    LeetCode169. Majority Element Given an array of size n, find the majority element. The majority elem ...

  8. 【刷题-LeetCode】229. Majority Element II

    Majority Element II Given an integer array of size n, find all elements that appear more than ⌊ n/3 ...

  9. [LeetCode] Majority Element II 求众数之二

    Given an integer array of size n, find all elements that appear more than ⌊ n/3 ⌋ times. The algorit ...

随机推荐

  1. git ssh使用公钥授权怎么都不通过

    前提: 1.客户端生成了id_rsa.pub和id_rsa 2.服务端在.ssh/authorized_keys也加入了客户端的id_res.pub 3./etc/ssh/sshd_config开启了 ...

  2. 【6折抢】戴尔i7新品Latitude高性能商用本

    致敬拼搏成长中的企业 戴尔5月有钜惠! 买1赠1送同款,单台价格2500元 这波来自戴尔官网的致敬很走心 满足初级办公和高性能运算多重需求 限时折扣火热开抢! 新品  latitude 6折抢! 戴尔 ...

  3. 精选15个国外CSS框架

    转自:http://blog.bingo929.com/css-frameworks-15.html 什么是css框架 实际上还是让我们从框架说起吧.框架就是一个你可以用于你的网站项目的基本的概念上的 ...

  4. jdk1.8新特性学习

    package com.xll.code.jdk1_8study; import com.xll.code.jdk1_8study.pojo.User; import org.junit.jupite ...

  5. vue-router 的重定向-redirect

    1. 我们主要在index.js重新设置路由的重新定向redirect参数 index.js import Vue from 'vue' import Router from 'vue-router' ...

  6. Java中的常量池

    JVM中有: Class文件常量池.运行时常量池.全局字符串常量池.基本类型包装类对象 常量池 Class文件常量池: class文件是一组以字节为单位的二进制数据流,在java代码的编译期间,编写的 ...

  7. 关于 argc 和 argv

    https://stackoverflow.com/questions/3898021/regarding-mainint-argc-char-argv 当使用命令行启动程序,或者给程序传输参数时,可 ...

  8. 安装和设置kubectl命令

    Linux [root@cx-- ~]# curl -LO https://storage.googleapis.com/kubernetes-release/release/v1.13.5/bin/ ...

  9. duilib库分析3.DUILibxml配置

    我这里是借用网友colin3dmax整理的关于duilib的分析哈,感谢他的分享,我觉得很有必要贴出来让大家都学习观摩下 DUILibxml配置项根节点        子类      属性       ...

  10. docker registry (私有仓库)

    首先要导入registry的镜像文件 1.普通的registry 一条命令创建一个仓库 docker run -d -p 5000:5000 --restart=always --name regis ...