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

题目:

数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。

 

你可以假设数组是非空的,并且给定的数组总是存在多数元素。

 

示例 1:

输入: [1, 2, 3, 2, 2, 2, 5, 4, 2]
输出: 2
 

限制:

1 <= 数组长度 <= 50000

 

解答:

利用摩尔计数法,对于所有元素,逐个遍历,相同的计数叠加,不同的元素与当前计数最多的元素进行计数相抵,最后保留的为所求,时间复杂度O(n);

 1 class Solution {
 2 
 3     //摩尔投票法
 4     public int majorityElement(int[] nums) {
 5         Integer m = null;
 6         int c = 0;
 7         for(int n : nums){
 8             //计数为0时需要重新对新值计数
 9             if(c == 0){
10                 m = n;
11                 c = 1;
12                 continue;
13             }
14             //如果不是同一个数则进行抵毁
15             if(m != n){
16                 c--;
17             }else{
18                 c++;
19             }
20         }
21         return m;
22     }
23 }

 

posted @ 2020-04-22 13:48  heaven夏  阅读(128)  评论(0编辑  收藏  举报