Majority Number

Given an array of integers, the majority number is the number that occurs more than half of the size of the array. Find it.

Example

Given [1, 1, 1, 1, 2, 2, 2], return 1

分析:

既然这里只有一个majority number,那么它的个数减去其它number个数之和还是为正值。

 public class Solution {
/**
* cnblogs.com/beiyeqingteng/
*/
public int majorityNumber(ArrayList<Integer> nums) {
int number = nums.get();
int count = ; for (int i = ; i < nums.size(); i++) {
if (count == ) {
number = nums.get(i);
count = ;
} else {
if (number == nums.get(i)) {
count++;
} else {
count--;
}
}
}
return number;
}
}

Majority Number II

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

Example

Given [1, 1, 1, 1, 2, 2, 2], return 1。

分析:
As there could be at most 2 elements occuring more than 1 / 3 of the array, we have 2 slots for majority number candidates. Each number votes like this:
  • (case 1) If it is one of the majority number candidates, it votes positive to itself, otherwise
  • (case 2) If there is one available majority number slot, it gets the slot and votes positive for itself,
  • (case 3) otherwise, it votes negative to both majority candidates.

At last, at least one of the two majority numbers must be more than 1 / 3 of the array.

 public class Solution {
/**
* @param nums: A list of integers
* @return: The majority number that occurs more than 1/3
* cnblogs.com/beiyeqingteng/
*
*/
public int majorityNumber(ArrayList<Integer> nums) {
if (nums == null || nums.size() == ) return -;
int number1 = , number2 = , count1 = , count2 = ; for (Integer i : nums) {
if (number1 == i) {// case 1
count1++;
} else if (number2 == i) {// case 1
count2++;
} else if (count1 == ) {// case 2
number1 = i;
count1 = ;
} else if (count2 == ) {// case 2
number2 = i;
count2 = ;
} else { // case 3
count1--;
count2--;
}
} // [1,1,1,1,2,2,3,3,4,4,4] cannot pass if the code below is not added.
count1 = ;
count2 = ; for (Integer i : nums) {
if (number1 == i) {
count1++;
} else if (number2 == i) {
count2++;
}
} return count1 > count2 ? number1 : number2;
}
}

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.

Example

Given [3,1,2,3,2,3,3,4,4,4] and k=3, return 3.

分析:

Same as above, as there could be at most (k – 1) elements occuring more than 1 / k of the array, we have (k – 1) slots for majority number candidates. The voting rule is the same as above.

Careful for the ConcurrentModificationException in HashMap, we should remove (write) the keys during the HashMap being iterated (read). Write the hashmap after read.

 public class Solution {
/**
* @param nums: A list of integers
* @param k: As described
* @return: The majority number
* cnblogs.com/beiyeqingteng/
*/
public int majorityNumber(ArrayList<Integer> nums, int k) {
if (nums == null || nums.size() == || k < ) return -;
HashMap<Integer, Integer> map = new HashMap<Integer, Integer>(); for (int n : nums) {
if (map.containsKey(n)) {
map.put(n, map.get(n) + );
} else {
// note: if we change condition to map.size() > k - 1, in this case, we assume
// there are at most k candidates, not k - 1, we can ignore the statements from
// line 27 - 35
if (map.size() >= k - ) {
decreaseVotes(map);
} else {
map.put(n, );
}
}
} for (int key : map.keySet()) {
map.put(key, );
} for (int n : nums) {
if (map.containsKey(n)) {
map.put(n, map.get(n) + );
}
} int maxKey = ;
int maxCount = ;
for (int key : map.keySet()) {
if (map.get(key) > maxCount) {
maxCount = map.get(key);
maxKey = key;
}
}
return maxKey; } private void decreaseVotes(Map<Integer, Integer> map) {
Set<Integer> keySet = map.keySet();
List<Integer> removeList = new ArrayList<>();
for (Integer key : keySet) {
if (map.get(key) == ) {
removeList.add(key);
}
else {
map.put(key, map.get(key) - );
}
}
//remove candidates with 0 votes and free the slot
for (Integer key : removeList) {
map.remove(key);
}
}
}

Reference:

http://blog.welkinlan.com/2015/05/29/majority-number-lintcode-java/

Majority Number I & || && |||的更多相关文章

  1. [LintCode] Majority Number 求众数

    Given an array of integers, the majority number is the number that occurs more than half of the size ...

  2. Lintcode: Majority Number III

    Given an array of integers and a number k, the majority number is the number that occurs more than 1 ...

  3. Lintcode: Majority Number II

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

  4. leetcode majority number

    给定一组数,有一个数在这组数里的出现次数超过n/2次. 求出这是哪个数 https://leetcode.com/problems/majority-element/ 一开始考虑的方是将所有数转化为二 ...

  5. lintcode 中等题:majority number III主元素III

    题目 主元素 III 给定一个整型数组,找到主元素,它在数组中的出现次数严格大于数组元素个数的1/k. 样例 ,返回 3 注意 数组中只有唯一的主元素 挑战 要求时间复杂度为O(n),空间复杂度为O( ...

  6. lintcode 中等题:Majority number II 主元素 II

    题目 主元素II 给定一个整型数组,找到主元素,它在数组中的出现次数严格大于数组元素个数的三分之一. 样例 给出数组[1,2,1,2,1,3,3] 返回 1 注意 数组中只有唯一的主元素 挑战 要求时 ...

  7. LintCode Majority Number II / III

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

  8. [LintCode] Majority Number 求大多数

    Given an array of integers, the majority number is the number that occurs more than half of the size ...

  9. Lintcode: Majority Number II 解题报告

    Majority Number II 原题链接: http://lintcode.com/en/problem/majority-number-ii/# Given an array of integ ...

随机推荐

  1. Nginx + FastCGI 程序(C/C++) 搭建高性能web service的Demo及部署发布

       FastCGI编程包括四部分:初始化编码.接收请求循环.响应内容.响应结束循环. FCGX_Request request; FCGX_Init(); ); FCGX_InitRequest(& ...

  2. Orchard源码分析(1):Orchard架构

      本文主要参考官方文档"How Orchard works"以及Orchardch上的翻译.   源码分析应该做到庖丁解牛,而不是以管窥豹或瞎子摸象.所以先对Orchard架构有 ...

  3. oracle 的wm_concat函数使用

    转载自:http://blog.itpub.net/post/42245/522757 首先让我们来看看这个神奇的函数wm_concat(列名),该函数可以把列值以","号分隔起来 ...

  4. 使用CFURLCreateStringByAddingPercentEscapes进行URL编码

    iOS程序访问HTTP资源时需要对URL进行UTF8编码,特酷吧在之前一直都喜欢使用NSString的stringByAddingPercentEscapesUsingEncoding方法进行编码.今 ...

  5. Checkstyle 简介 以及各版本下载地址

    CheckStyle是SourceForge下的一个项目,提供了一个帮助JAVA开发人员遵守某些编码规范的工具.它能够自动化代码规范检查过程,从而使得开发人员从这项重要,但是枯燥的任务中解脱出来. C ...

  6. virtualBox切换到无缝模式后,如何调出菜单

    host+c host就是指右边的那个ctrl键

  7. systemd

    本文参照:https://wiki.archlinux.org/index.php/Systemd#Basic_systemctl_usage 做了翻译和整理 systemd是Linux下的一种ini ...

  8. PHP获取MAC地址的函数代码

    获取网卡的MAC地址原码;目前支持WIN/LINUX系统 获取机器网卡的物理(MAC)地址   复制代码 代码如下: <?php /** 获取网卡的MAC地址原码:目前支持WIN/LINUX系统 ...

  9. glusterFS的常用命令 (转)

    1.       启动/关闭/查看glusterd服务 # /etc/init.d/glusterd start # /etc/init.d/glusterd stop # /etc/init.d/g ...

  10. python 爬虫1

    简单访问有道词典的翻译界面,将页面翻译功能简单呈现 import urllib.request import urllib.parse import json content = input(&quo ...