题目描述
给定一个整数数组,包含n个整数,请找出出现次数大于n/2的数,数组保证存在解。
例如:
input:2 3 3 3 2
output:3
方法一 摩尔投票法
思路:摩尔投票法的基本思想很简单,在每一轮投票过程中,从数组中找出一对不同的元素,将其从数组中删除。这样不断的删除直到无法再进行投票,如果数组为空,则没有任何元素出现的次数超过该数组长度的一半。如果只存在一种元素,那么这个元素则可能为目标元素。
时间复杂度:O(n)
空间复杂度:O(1)
//摩尔投票法
public static int findByMoer(int[] nums){
int cur = 0;
int cnt = 0;
for(int n : nums){
if(cnt == 0){
cur = n;
}
//如果相同则计数加一,否则消除一组
cnt = n == cur ? ++cnt : --cnt