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,找出所有同时在二维网格和字典中出现的单词. 单 ...
随机推荐
- PHP--自动回调接口,分批修改数据
/** * 修复 a表 生日格式问题 * @author qin */ public function update_birthday_one() { $this->load->model ...
- nextjs服务端渲染原理
1. 简单的介绍一下 nextjs是react进行服务端渲染的一个工具,默认以根目录下的pages为渲染路由 比如我在pages目录下创建一个index.js文件,然后export default一个 ...
- 19-10-25-G-悲伤
此题未通过 [ 老帅哥 ] 认证. ZJ一下: T1,明显是二分答案+$dij/SPFA$ T2,没看懂题. T3,打了一个$\Theta(N^2)$暴力. 事实上…… T1,T2死了. T1中 每次 ...
- 关于自定义 UITableViewCell
自定义UITableViewCell的方法有很多 发现一些人都会遇到自己定义的cell里面图片错乱的问题 这个问题往往是因为没有实现prepareForReuse这个方法导致的. UITableVie ...
- POSIX基本正则表达式和扩展正则表达式的比较
转自:http://book.51cto.com/art/201303/385961.htm 在读者正觉得正则表达式已经复杂得不能再复杂时,又会发现POSIX规范将正则表达式的实现方法分为了两种:基本 ...
- TF-IDF了解
http://en.wikipedia.org/wiki/Tf%E2%80%93idf
- [jeecms]获取父栏目下的子栏目名称
[@cms_channel_list parentId='父栏目id'] [#list tag_list as c] <a href="${c.url}">${c.na ...
- compareTo)--list 根据某字段排序
Collections.sort(actList, new Comparator<Act>() { @Override public int compare(Act o1, Act o2) ...
- JasperReports报表表达式12
报表表达式是JasperReports使我们能够显示在报表上的数据计算的强大功能.计算出数据不是一个静态数据,并且不受特别的报表参数或数据源字段传递的数据.报表表达式是由组合报表参数,字段和静态数据. ...
- 创建Hadoop用户