[leetcode39/169]PHP计算数组中出现次数超过一半的数字得出这个数字。您可以假设数组是非空的,并且给定数组中的元素总是占多数。例1:输入:[1,2,3,2,2,2,5,4,2]输出:2来源:LeetCode链接:https://leetcode-cn.com/probl...解题思路1类似于array_count_values函数的作用。代码类解决方案{/***@paramInteger[]$nums*@returnInteger*/functionmajorityElement($nums){$halfLength=floor(count($nums)/2);$检查=[];foreach($numsas$item){if($check[$item]>$halfLength){返回$item;$check[$item]+=1;}}}解决问题思路2——摩尔投票法摩尔投票算法(Boyer–Mooremajorityvotealgorithm),是一种在O(n)的时间复杂度下找到线性表中一半以上元素的算法,O(1)的空间复杂度。用流思维处理数据。场景:如何在任意数量的候选人中选出具有压倒性优势的人(票数乱序)?(这个人得到的选票比其他所有人加起来还要多,也就是超过1/2)。当票数按顺序排列时,此问题非常简单,因为整个线性表的中值必须在细分市场中,长度大于1/2:如果段开始,则必须大于1/2,如果段在末尾,则段头必须小于1/2。我们只需要检查线性表的中位数就可以得到结果,时间复杂度为O(1)。Whentheballotsareoutoforder,ifyouwanttousethismethod,youmustsortthelinearlist,andthetimecomplexitywillincreasetothetimecomplexityofthesortingalgorithmused.那么有没有办法只顺序访问线性表就可以得到答案呢?那是摩尔投票。原理:摩尔算法的核心思想是任何元素成对偏移,最后剩下的元素必须出现1/2次以上。算法维护了一个序列元素num和一个counter,num表示当前的个数,counter表示这个元素可以偏移几个元素。代码类解决方案{/***@paramInteger[]$nums*@returnInteger*/functionmajorityElement($nums){$votes=0;foreach($numsas$num){if($votes==0)$x=$num;$votes+=$num==$x?1:-1;}返回$x;}}参考链接MooreVotingAlgorithm(DoubleAngleUnderstanding)leetcode官方题解推荐一个通过面试的算法,通过40讲折扣购买
