LeetCode169. Majority Element

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

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

分析:

抵消的思想,维护一个result和count,与result相同则count++,否则count--,到0时更新result的值,由于主元素个数较多,所有最后一定能留下。

代码:

 class Solution {
public:
int majorityElement(vector<int>& nums) {
int result = ;
int count = ;
for (int i = ; i < nums.size(); ++i) {
if (nums[i] == result && count != ) {
count++;
}
else if (count == ) {
result = nums[i];
count = ;
}
else {
count--;
}
}
return result;
}
};

LintCode47. Majority NumberII

Given an array of integers, the majority number is the number that occurs more than 1/3 of the size of the array. (Medium)

Find it.

Notice : There is only one majority number in the array.

分析:

同majority number1的思路相似,维护两个result和count,相同则对相应count操作,不同则均减一;

注意最后剩下两个元素,并不一定count值大的就一定是出现次数多的(可能另一个参与抵消过多),所以需要重新遍历一遍,对这个两个数比较出现次数大小。

代码:

 class Solution {
public:
/**
* @param nums: A list of integers
* @return: The majority number occurs more than 1/3.
*/
int majorityNumber(vector<int> nums) {
// write your code here
int candidate1 = , candidate2 = ;
int count1 = , count2 = ;
for (int i = ; i < nums.size(); ++i) {
if (nums[i] == candidate1 && count1 != ) {
count1++;
}
else if (nums[i] == candidate2 && count2 != ) {
count2++;
}
else if (count1 == ) {
candidate1 = nums[i];
count1 = ;
}
else if (count2 == ) {
candidate2 = nums[i];
count2 = ;
}
else {
count1--;
count2--;
}
}
count1 = ;
count2 = ;
for (int i = ; i < nums.size(); ++i) {
if (nums[i] == candidate1) {
count1++;
}
else if (nums[i] == candidate2) {
count2++;
}
}
return count1 > count2 ? candidate1 : candidate2;
}
};

LeetCode229. 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.(Medium)

分析:

这个与lintcode中的majority number2基本相似,只是要求找到所有的大于n / 3次的元素(至多也就是两个);

所以最后一步从比较两个canditate的count大小,变成将这两个count与 size() / 3比较。

代码:

 class Solution {
public:
vector<int> majorityElement(vector<int>& nums) {
int candidate1 = , candidate2 = ;
int count1 = , count2 = ;
for (int i = ; i < nums.size(); ++i) {
if (nums[i] == candidate1 && count1 != ) {
count1++;
}
else if (nums[i] == candidate2 && count2 != ) {
count2++;
}
else if (count1 == ) {
candidate1 = nums[i];
count1 = ;
}
else if (count2 == ) {
candidate2 = nums[i];
count2 = ;
}
else {
count1--;
count2--;
}
}
count1 = ;
count2 = ;
for (int i = ; i < nums.size(); ++i) {
if (nums[i] == candidate1) {
count1++;
}
else if (nums[i] == candidate2) {
count2++;
}
}
vector<int> result;
if (count1 > nums.size() / ) {
result.push_back(candidate1);
}
if (count2 > nums.size() / ) {
result.push_back(candidate2);
}
return result; }
};

LintCode48. Majority Number III

Given an array of integers and a number k, the majority number is the number that occurs more than 1/k of the size of the array. (Medium)

Find it.

Notice:There is only one majority number in the array.

分析:

从前一题的1/3变为1/k,道理还是一样,不过这次需要用一个hashmap来维护出现的次数,注意unordered_map插入删除相关操作的写法即可。

尤其hashmap元素个数等于k需要删除的时候,需要维护一个vector存key,如果用iterator边走边删除可能出现位置变化。

代码:

 class Solution {
public:
/**
* @param nums: A list of integers
* @param k: As described
* @return: The majority number
*/
int majorityNumber(vector<int> nums, int k) {
// write your code here
unordered_map<int, int> hash;
for (int i = ; i < nums.size(); ++i) {
if (hash.size() < k) {
hash[nums[i]]++;
}
else {
vector<int> eraseVec;
for (auto itr = hash.begin(); itr != hash.end(); ++itr) {
(itr -> second)--;
if (itr -> second == ) {
eraseVec.push_back(itr -> first);
}
}
for (int i = ; i < eraseVec.size(); ++i) {
hash.erase(eraseVec[i]);
}
hash[nums[i]]++;
}
}
for (auto& n : hash) {
n.second = ;
}
for (int i = ; i < nums.size(); ++i) {
if (hash.find(nums[i]) != hash.end()) {
hash[nums[i]]++;
if (hash[nums[i]] > nums.size() / k) {
return nums[i];
}
}
}
return -;
}
};

LeetCode169 Majority Element, LintCode47 Majority Number II, LeetCode229 Majority Element II, LintCode48 Majority Number III的更多相关文章

  1. [Swift]LeetCode503. 下一个更大元素 II | Next Greater Element II

    Given a circular array (the next element of the last element is the first element of the array), pri ...

  2. [LeetCode] 305. Number of Islands II 岛屿的数量 II

    A 2d grid map of m rows and n columns is initially filled with water. We may perform an addLand oper ...

  3. lintcode 中等题:N Queens II N皇后问题 II

    题目: N皇后问题 II 根据n皇后问题,现在返回n皇后不同的解决方案的数量而不是具体的放置布局. 样例 比如n=4,存在2种解决方案 解题: 和上一题差不多,这里只是求数量,这个题目定义全局变量,递 ...

  4. HDU 3567 Eight II(八数码 II)

    HDU 3567 Eight II(八数码 II) /65536 K (Java/Others)   Problem Description - 题目描述 Eight-puzzle, which is ...

  5. DE1-SOC开发板上搭建NIOS II处理器运行UCOS II

    DE1-SOC开发板上搭建NIOS II处理器运行UCOS II   今天在DE1-SOC的开发板上搭建NIOS II软核运行了UCOS II,整个开发过程比较繁琐,稍微有一步做的不对,就会导致整个过 ...

  6. 杨辉三角形II(Pascal's Triangle II)

    杨辉三角形II(Pascal's Triangle II) 问题 给出一个索引k,返回杨辉三角形的第k行. 例如,给出k = 3,返回[1, 3, 3, 1] 注意: 你可以优化你的算法使之只使用O( ...

  7. [Swift]LeetCode407. 接雨水 II | Trapping Rain Water II

    Given an m x n matrix of positive integers representing the height of each unit cell in a 2D elevati ...

  8. 【LeetCode-面试算法经典-Java实现】【059-Spiral Matrix II(螺旋矩阵II)】

    [059-Spiral Matrix II(螺旋矩阵II)] [LeetCode-面试算法经典-Java实现][全部题目文件夹索引] 原题 Given an integer n, generate a ...

  9. Leetcode之回溯法专题-212. 单词搜索 II(Word Search II)

    Leetcode之回溯法专题-212. 单词搜索 II(Word Search II) 给定一个二维网格 board 和一个字典中的单词列表 words,找出所有同时在二维网格和字典中出现的单词. 单 ...

随机推荐

  1. mac上开启22号端口

    在苹果maC系统SSH 远程登录服务器,采用默认22端口,登录出现了以下的提示: @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ...

  2. Ionic 发布Release 版本

    1.生成releases 版本  cordova build android --release 如果你在生成release版本出错,请修改build.gradle 2.生成签名文件 生成成功后会在G ...

  3. git add命令后出现Another git process seems to be running in this repositor...错误提示

    问题原因 在控制台使用git命令操作时,使用了 git commit 进入了commit信息书写页面,大多数人因为不太熟悉vim的操作导致不知怎么结束编写,就进行了直接关闭控制台的操作,但是此时git ...

  4. Android SDK上手指南:下一步学习方向

    Android SDK上手指南:下一步学习方向 2014-02-28 11:01 核子可乐 译 51CTO 字号:T | T 到目前为止,我们已经介绍过的知识足以帮助大家从非常理想的起点开始进行And ...

  5. k8s 内部各个部件运转

    Master节点部署的都是kubernetes的核心模块APIServer提供资源操作的唯一入口,并且提供认证/授权/kubernets的访问控制可以通过kubectl和自己开发的客户端,通过http ...

  6. VS2015使用Nuget安装OpenCV3.X以及Python3安装OpenCV3.X

    VS2015已经自带Nuget安装工具了,所以,新建一个项目,点击管理Nuget包 搜索OpenCV3 注意,目前只有这个版本支持VS2015,也就是平台工具集可以为vs140,其他的都会报错,报错我 ...

  7. layui -page 分页类

    <?phpnamespace page; // +---------------------------------------------------------------------- / ...

  8. nginx 下开启pathinfo模式

    前几天自己新弄了个服务器,nginx的环境, 看到thinkcmf的框架,下载下来准备研究下,安装完成后,发现 url 是 普通模式,然后我就按照那个手册去后台开启了pathinfo模式,这一改完蛋了 ...

  9. stream的filter用法

    Person p1 = new Person("张三", new BigDecimal("23.0"));Person p2 = new Person(&quo ...

  10. 【python之路43】tornado的用法(一)

    一.tonado的代码 1.返回字符串 #!/usr/bin/env python # -*- coding:utf-8 -*- import tornado.ioloop import tornad ...