package com.interview.leetcode.arrays;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
/**
* Created_By: stefanie
* Date: 14-11-18
* Time: 上午7:52
*
* Game from LintCode:
* http://lintcode.com/en/problem/majority-number-i/
* http://lintcode.com/en/problem/majority-number-ii/
* http://lintcode.com/en/problem/majority-number-iii/
*
*/
public class MajorityNumber {
public static int majorityNumber2(int[] nums) {
if(nums == null || nums.length <= 0) return -1;
int candidate = 0;
int count = 0;
for(int i = 0; i < nums.length; i++){
int current = nums[i];
if(count == 0) candidate = current;
if(current == candidate) count++;
else count--;
}
return candidate;
}
public static int majorityNumber3(int[] nums) {
// write your code
int one = 0; int countOne = 0;
int two = 0; int countTwo = 0;
for(int i = 0; i < nums.length; i++){
int current = nums[i];
if(countOne == 0) one = current;
else if(countTwo == 0) two = current;
if(current == one) countOne++;
else if(current == two) countTwo++;
else {
countOne--;
countTwo--;
}
}
countOne = 0; countTwo = 0;
for(int i = 0; i < nums.length; i++){
int current = nums[i];
if(current == one) countOne++;
else if(current == two) countTwo++;
}
return countOne >= countTwo? one : two;
}
public int majorityNumber(ArrayList<Integer> nums, int k) {
// write your code
HashMap<Integer, Integer> counter = new HashMap<Integer, Integer>();
for(int i = 0; i < nums.size(); i++){
int current = nums.get(i);
if(counter.containsKey(current)){
counter.put(current, counter.get(current) + 1);
} else if(counter.size() < k){
counter.put(current, 1);
} else { //decrease all the candidates counter by one, and remove candidate if it's counter == 0
Iterator<Map.Entry<Integer, Integer>> iterator = counter.entrySet().iterator();
while(iterator.hasNext()){
Map.Entry<Integer, Integer> item = iterator.next();
if(item.getValue() == 1) iterator.remove();
else item.setValue(item.getValue() - 1);
}
}
}
for(Integer key : counter.keySet()) counter.put(key, 0);
for(int i = 0; i < nums.size(); i++){
int current = nums.get(i);
if(counter.containsKey(current)) counter.put(current, counter.get(current) + 1);
}
int max = 0;
int maxCount = 0;
Iterator<Map.Entry<Integer, Integer>> iterator = counter.entrySet().iterator();
while(iterator.hasNext()){
Map.Entry<Integer, Integer> item = iterator.next();
if(item.getValue() > maxCount){
max = item.getKey();
maxCount = item.getValue();
}
}
return max;
}
}