题目描述
数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为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;
}
}


京公网安备 11010502036488号