数组中出现次数超过一半的数字
题目:
数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。
你可以假设数组是非空的,并且给定的数组总是存在多数元素。
示例 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 }