力扣 每日一题 面试题 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 }
浙公网安备 33010602011771号