数组中出现次数超过一半的数字_JAVA_简单
数组中出现次数超过一半的数字
https://www.nowcoder.com/practice/e8a1b01a2df14cb2b228b30ee6a92163?tpId=13&&tqId=11181&rp=1&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking
哈希法
用map存储每个键值的出现次数,存完检查为众数直接返回该数,循环结束直接返回0
import java.util.*; public class Solution { public int MoreThanHalfNum_Solution(int [] array) { Map<Integer,Integer> map = new HashMap(); for(int e : array) { // 记录e出现次数 if(map.containsKey(e)) { map.put(e,map.get(e) + 1); } else { map.put(e, 1); } // 超过一半则直接返回 if(map.get(e) > array.length / 2) { return e; } }; return 0; } }
候选人法
- 若一定存在一个众数:遍历数组,每到一个元素会经历一次投票,如果目前候选人为自己,票+1,否则票-1,由于众数出现次数超过其他所有数,所以即使其他人全投的众数反对票,众数也能当任,即最后剩下的候选人为众数
- 若不一定存在众数:候选人法可能出现问题,则再遍历一边查看是否为众数即可
import java.util.*; public class Solution { public int MoreThanHalfNum_Solution(int [] array) { int people = 0, tickets = 0; // 轮流投票 for(int e : array) { // 新人上任 if(tickets == 0) { people = e; } // 支持自己,反对别人 if(people == e) { tickets++; } else { tickets--; } } // 检测该数是否为众数 tickets = 0; for(int e : array) { if(e == people && ++tickets > array.length / 2) { return people; } } return 0; } }