【剑指offer】数组中出现超过一半的数字
2009 年 4 月 15 日
题目描述
数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。
解题思路
- 最开始使用排序大法,最小是 O(nlogn)的复杂度,后面借鉴了discuss的内容;
- 设定两个变量,一个value用于保存当前值,一个count用于保存次数;
- 如果当前元素与value相同,则count加一;
- 如果当前元素与value相同,则count减一;
- 如果count是0,则证明当前的数字出现的次数已经抵消掉了之前不同的数字,所以更新value和count。
public class Solution { public int MoreThanHalfNum_Solution(int [] array) { if(array == null || array.length == 0) return 0; int value = array[0]; int count = 1; for(int i = 1; i < array.length; i++){ if(count == 0){ value = array[i]; count = 1; } else if(value == array[i]){ count++; } else { count--; } } count = 0; for(int i = 0; i (array.length / 2)) return value; return 0; } }