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 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的更多相关文章
- [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 ...
- [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 ...
- lintcode 中等题:N Queens II N皇后问题 II
题目: N皇后问题 II 根据n皇后问题,现在返回n皇后不同的解决方案的数量而不是具体的放置布局. 样例 比如n=4,存在2种解决方案 解题: 和上一题差不多,这里只是求数量,这个题目定义全局变量,递 ...
- HDU 3567 Eight II(八数码 II)
HDU 3567 Eight II(八数码 II) /65536 K (Java/Others) Problem Description - 题目描述 Eight-puzzle, which is ...
- DE1-SOC开发板上搭建NIOS II处理器运行UCOS II
DE1-SOC开发板上搭建NIOS II处理器运行UCOS II 今天在DE1-SOC的开发板上搭建NIOS II软核运行了UCOS II,整个开发过程比较繁琐,稍微有一步做的不对,就会导致整个过 ...
- 杨辉三角形II(Pascal's Triangle II)
杨辉三角形II(Pascal's Triangle II) 问题 给出一个索引k,返回杨辉三角形的第k行. 例如,给出k = 3,返回[1, 3, 3, 1] 注意: 你可以优化你的算法使之只使用O( ...
- [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 ...
- 【LeetCode-面试算法经典-Java实现】【059-Spiral Matrix II(螺旋矩阵II)】
[059-Spiral Matrix II(螺旋矩阵II)] [LeetCode-面试算法经典-Java实现][全部题目文件夹索引] 原题 Given an integer n, generate a ...
- Leetcode之回溯法专题-212. 单词搜索 II(Word Search II)
Leetcode之回溯法专题-212. 单词搜索 II(Word Search II) 给定一个二维网格 board 和一个字典中的单词列表 words,找出所有同时在二维网格和字典中出现的单词. 单 ...
随机推荐
- NOIP2018崩崩记
比赛前,做做往年的题目,嗯,似乎都很水,400+绝对没问题,如果完全发挥,起码500+. 然而-- Day0 这天是运动会,信息学的同学们向老师请假来机房. 然后我在机房里刷往届的题目,信心倍增. 最 ...
- axios post请求后台接收不到参数 和 一些配置问题
原因: axios 的 headers的 content-type 默认是 “application/json ”,传给后台的格式是这样的: 但是后台接收数据的格式一般是表单格式的,就是formda ...
- 【Redis缓存机制】1.Redis介绍和使用场景
(1)持久化数据库的缺点平常我们使用的关系型数据库有Mysql.Oracle以及SqlServer等,在开发的过程中,数据通常都是通过Web提供的数据库驱动来链接数据库进行增删改查. 那么,我们日常使 ...
- JavaScript对象继承方式
一.对象冒充 其原理如下:构造函数使用 this 关键字给所有属性和方法赋值(即采用类声明的构造函数方式).因为构造函数只是一个函数,所以可使 Parent 构造函数 成为 Children 的方法, ...
- VS中warning MSB8004和error MSB4018解决方案
问题如下: warning MSB8004: Output Directory does not end with a trailing slash. This build instance wil ...
- js 之观察者模式
观察者模式又叫发布订阅模式(Publish/Subscribe),它定义了一种一对多的关系,让多个观察者对象同时监听某一个主题对象,这个主题对象的状态发生变化时就会通知所有的观察者对象,使得它们能够自 ...
- Java 8 的新特性和Java 的4种引用方式
一.接口的增强 Java 8允许我们给接口添加一个非抽象的方法实现,只需要使用 default关键字即可,这个特征又叫做扩展方法,示例如下: interface Formula { double ca ...
- Leetcode264. Ugly Number II丑数2
编写一个程序,找出第 n 个丑数. 丑数就是只包含质因数 2, 3, 5 的正整数. 示例: 输入: n = 10 输出: 12 解释: 1, 2, 3, 4, 5, 6, 8, 9, 10, 12 ...
- SmartSQL
- Java方法传参的问题
1.基本数据类型(byte,short,int,long,float,double,boolean,char)的值传递,不改变其值 2.引用数据类型的值传递,改变其值 3.String类型虽然是引用数 ...