消减法。设置两个变量空间:candidate表示候选数,HP表示候选数出现的次数,基这两个变量来统计。遍历数组,把两个不同的数消去,相同的数记录出现的次数,进行叠加。
public class Solution { public int MoreThanHalfNum_Solution(int [] nums) { if (nums.length == 0 || nums == null){ return -1; } int candidate = 0; //候选数 int HP = 0; // 根据HP 更新候选数 for (int i = 0; i < nums.length; i++){ if (HP == 0){//若HP为0,将当前数设为候选数。同时将HP置为1 candidate = nums[i]; HP = 1; }else if (nums[i] != candidate){//有候选的情况 //当前数不等于候选数,一并删除 HP--; }else{ //有候选,且相同 HP++; } } if (HP == 0){//说明没有,返回-1 return -1; } //遍历完成后,若有数剩下来了,那么HP一定>0。但,不知道这个数是不是水王数, // 所以需要遍历,去统计这个数在数组中实际 出现的次数。 int count = 0; for (int num : nums) { if (num == candidate){ count++; } } return count > (nums.length >> 1) ? candidate : -1; } }