数组中出现次数超过一半的数字

题目:数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为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 }

 

posted @ 2019-05-02 19:25  JingMo  阅读(56)  评论(0)    收藏  举报