题目描述
数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。
1、思路分析
首先找出最有可能出现次数超过一半的元素,注意不是找出出现次数的元素。利用的思路也很巧妙,设当前最有可能的元素出现的次数为count,如果后面的数字不等于该元素,count自减1,直到count为0,这说明此时找出的元素出现次数最多为数组长度一半,并且最有可能的元素只有可能存在当前索引后面的位置。最后就是计算这个元素出现的次数进行判断,因为可能不存在满足要求的数字。
2、代码
public class Solution { public int MoreThanHalfNum_Solution(int [] array) { int count = 0; int temp = 0; // 找到出现次数最有可能超过数组长度一半的元素 for(int i = 0; i < array.length; i++) { if(temp == array[i]) count++; else if(count > 0) count--; else { temp = array[i]; count = 1; } } // 计算该元素出现的次数 count = 0; for(int i = 0; i < array.length; i++) { if(temp == array[i]) count++; } return count>array.length/2?temp:0; } }