题目描述
数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。
思路
这道题最简单的思路就是排序,然后统计每个数字出现的次数,这样时间复杂度是O(nlogn)。
也可以用哈希表进行次数的统计,但是这样最大的空间复杂度是O(n)。
这里提供一种时间复杂度是O(n),空间复杂度是O(1)的解法。
数组中有一个数字出现的数字超过数组长度的一半,也就是说它出现的次数比其他所有数字出现的次数还要多。在遍历数组的时候,保存三个变量,一个是当前元素出现的次数,一个是当前元素,一个是数组中出现次数最多的元素值。当我们遍历到下一个数字的时候,如果下一个数字和当前元素值相等,则次数加1,如果不相等,则次数减1。如果次数为0,则当前元素等于下一个数字,并把次数设为1,最后剩下的那个肯定是出现次数最多的元素,记录出现次数最多的元素值,最后验证是否超过数组一半的数字。
代码
public class Solution { public int MoreThanHalfNum_Solution(int[] array) { int count = 1;//当前元素出现的次数 int number = array[0];//当前的元素 int maxnum = array[0];//数组中出现次数最多的元素值 for (int i = 1; i < array.length; i++) { if(array[i] != number){ count--; if(count == 0){ number = array[i]; maxnum = array[i]; count = 1; } }else{ count++; } } //验证 int sum = 0; for (int i = 0; i < array.length; i++) { if(array[i] == maxnum){ sum++; } } return sum * 2 > array.length ? maxnum : 0; } }