Majority Number I & || && |||

时间:2023-03-09 18:35:52
Majority Number I & || && |||

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/