数组中出现次数超过一半的数字
题目:数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。
分析:
- 利用数组特点找出 O(N) 的算法:
- 题目中要找的数字出现的次数超过数组长度的一半,也就是说它出现的次数比其他所有数字出现的次数的和还要多。
- 因此我们可以考虑在遍历数组的时候保存两个值:一个是数组中的一个数字,一个是次数。
- 当我们遍历到下一个数字的时候,如果下一个数字和当前我们保存的数字相同,则次数加 1;如果和当前我们保存的数字不同,则次数减 1;
- 当次数减到 0 的时候,我们将保存的数字改为当前遍历所处的位置,并将次数更改为 1。
1 public class Solution {
2 public int MoreThanHalfNum_Solution(int [] array) {
3 int count=1;
4 int result=array[0];
5 for(int i=1;i<array.length;i++){
6 if(array[i]==result){
7 count++;
8 }else if(count==0){
9 result=array[i];
10 count=1;
11 }else{
12 count--;
13 }
14 }
15 count=0;
16 for(int i=0;i<array.length;i++){
17 if(array[i]==result){
18 count++;
19 }
20 }
21 return count>array.length/2?result:0;
22 }
23 }

浙公网安备 33010602011771号