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. Ionic Cordova Sqlite 实现保存用户名登陆

    1.添加sqlite 组件 cordova plugin add https://github.com/litehelpers/Cordova-sqlite-storage.git --save 2. ...

  2. LA3983 Robotruck

    虫洞 单调队列优化DP,感觉比较套路?上不去Vjudge,也懒得打就随便口胡一下.sxy大佬要是您看的我要是扯淡麻烦提醒我一下QAQ sum[i]表示从0到i依次走的距离,sg[i]表示1~i的重量和 ...

  3. 在skyline中将井盖、雨水箅子等部件放到地面模型上

    公司三维建模组遇到这样的一个问题,怎样将井盖.雨水盖子恰好放在做好的地面模型上.传统的方法是在skyline中逐个调整井盖的对地高度,就是调整为恰好能放在地面上.或者选择很粗糙的一个方法,在“高度”属 ...

  4. ROCR包中ROC曲线计算是取大于cutoff还是大于等于cutoff

    找到对应的代码如下 .compute.unnormalized.roc.curve function (predictions, labels) { pos.label <- levels(la ...

  5. jeecmsv8 shiro 分析

      源代码注释可见 https://github.com/chenbo19867758/jeecmsV8-BoBo.git 1.后台登录页面 /jeeadmin/jeecms/login.do 1 w ...

  6. combobox 的onLoadSuccess执行两次解决办法和 取值赋值

    加红色字部分 jsp <input class="easyui-combobox" id="keshi" name="keshi" v ...

  7. JDBC2 --- 获取数据库连接的方式二 --- 技术搬运工(尚硅谷)

    /** * 方式二,对方式一的迭代 * 在如下的程序中,不出现第三方的api,使得程序具有更好的可移植性. * @throws Exception */ @Test public void testC ...

  8. java异常处理throw和throws的区别

    throws和throw区别 throws是用来声明一个方法可能抛出的所有异常信息,throws是将异常声明但是不处理,而是将异常往上传,谁调用我就交给谁处理. 而throw则是指抛出的一个具体的异常 ...

  9. org.apache.ant实现压缩和解压

    <dependency> <groupId>org.apache.ant</groupId> <artifactId>ant</artifactI ...

  10. HDFS数据读写过程