题目描述
数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。
示例1
输入
复制
[1,2,3,2,2,2,5,4,2]
返回值
复制
2
多数解决方案选择两次遍历找出目标,在摩尔投票法的基础上,本解给出借助辅助变量tag一次遍历找出目标的方法
public class Solution { public int MoreThanHalfNum_Solution(int [] array) { //摩尔投票法,cond用来记录候选人 int cond = -1; //cnt记录票数 int cnt = 0; //辅助变量tag用来记录上一个cond,默认值为-1 int tag = -1; for (int i = 0; i < array.length; ++i){ //每次候选人选票为零时,更换为下一个候选人 if (cnt == 0){ //tag记录上一个候选人,如果第一个数字选为候选人之后未曾更换,tag==-1 tag = cond; cond = array[i]; ++cnt; } else { if (cond == array[i]) ++cnt; else { --cnt;} } } //cnt > 0 && tag == cond 识别数组长度为奇数且最后一位数字是目标数字的情况 //tag == -1 识别候选人未曾变更过的情况 //cnt > 1识别目标数字出现次数大于**总数一半+1**的情况 if ( (cnt > 0 && tag ==cond) || tag == -1 || cnt > 1){ return cond; } return 0; } }