力扣 每日一题 面试题 17.10. 主要元素

今天的每日一题,一看是面试经典里的,就觉得有戏,因为一般书上的题相对比较简单。果然,从题目看来还是比较直接的,没什么难度,但是结合要求,需要O(1)的空间复杂度,就增加了些许复杂性。

通过这个题目,又学到新知识,所以忍不住写一篇来记录、总结、探讨(三连)

题目:

数组中占比超过一半的元素称之为主要元素。给你一个 整数 数组,找出其中的主要元素。若没有,返回 -1 。请设计时间复杂度为 O(N) 、空间复杂度为 O(1) 的解决方案。

示例:

输入:[1,2,5,9,5,9,5,5,5]
输出:5

本题需要使用到摩尔投票算法,摩尔投票算法是一个用来计算众数的算法,特点是输入无序的数组,计算出出现次数最多的数字。具体请参考https://cloud.tencent.com/developer/article/1600607

在本题中,分为两个阶段,统计阶段和验证阶段。

统计阶段根据记录candidate,然后将不同的元素两两消除,最后挺到最后的candidate就是一个众数。消除时需要借助count,去判断是否消除,count为0时,消除,不为0时,与candidate相同,count++,与candidate不同,count--。

验证阶段就是简单的计数,比较简单。

具体代码。

 1  public int majorityElement(int[] nums) {
 2        int candidate = -1;
 3        int count=0;
 4        for(int i:nums){
 5            if(candidate==i){
 6                count++;
 7            }else{
 8                if(count==0){
 9                    candidate=i;
10                    count=1;
11                }else {
12                    count--;
13                }
14            }
15        }
16        count=0;
17        for(int i :nums){
18            if(i==candidate){
19                count++;
20            }
21        }
22        if(count>nums.length>>1){
23            return candidate;
24        }
25         return -1;
26     }

 

posted on 2021-07-09 14:38  jejas  阅读(90)  评论(0)    收藏  举报