代码:
public class MajorityElement {
//常规思路
public int majorityElement1(int[] nums) {
int result = 0;
Map<Integer, Integer> hashMap = new HashMap<>();
for (int i = 0; i < nums.length; i++) {
if (hashMap.containsKey(nums[i])) {
int value = hashMap.get(nums[i]);
hashMap.put(nums[i], ++value);
continue;
}
hashMap.put(nums[i], 1);
}
Set<Map.Entry<Integer, Integer>> entrySet = hashMap.entrySet();
Iterator<Map.Entry<Integer, Integer>> iterator = entrySet.iterator();
while (iterator.hasNext()) {
Map.Entry<Integer, Integer> entry = iterator.next();
if (entry.getValue() > nums.length / 2) {
result = entry.getKey();
}
}
return result;
}
//大佬思路
/**
* 摩尔投票法:
* <p>
* 核心就是对拼消耗。
* <p>
* 玩一个诸侯争霸的游戏,假设你方人口超过总人口一半以上,并且能保证每个人口出去干仗都能一对一同归于尽。最后还有人活下来的国家就是胜利。
* <p>
* 那就大混战呗,最差所有人都联合起来对付你(对应你每次选择作为计数器的数都是众数),或者其他国家也会相互攻击(会选择其他数作为计数器的数),但是只要你们不要内斗,最后肯定你赢。
* <p>
* 最后能剩下的必定是自己人。
*/
public int majorityElement(int[] nums) {
int temp = nums[0];
nums[0] = 1;
for (int i = 1; i < nums.length; i++) {
if (temp != nums[i]) {
nums[0]--;
} else {
nums[0]++;
}
if (nums[0] == 0) {
nums[0] = 1;
temp = nums[i];
}
}
return temp;
}
}