javaee论坛

普通会员

225648

帖子

335

回复

349

积分

楼主
发表于 2019-11-04 09:16:43 | 查看: 78 | 回复: 1

给定一个大小为n的数组,找到其中的众数。众数是指在数组中出现次数大于⌊n/2⌋的元素。

你可以假设数组是非空的,并且给定的数组总是存在众数。

示例1:

输入:[3,2,3]输出:3

示例2:

输入:[2,2,1,1,1,2,2]输出:2思路

思路一:

利用哈希表的映射,储存数组中的数字以及它们出现的次数,当众数出现时,返回这个数字。

思路二:

因为众数是出现次数大于n/2的数字,所以排序之后中间的那个数字一定是众数。即nums[n/2]为众数。但是在计算比较大的数组时,时间会超过限制。

思路三:

分治法,将整个数组分成两个部分,先分别筛选出这两部分中出现次数最多的数,记为left和right,如果left等于right,则返回left,如果left不等于right,则left和right都是最终结果的候选,此时需要遍历整个数组考察left和right出现的次数,出现次数较多的就是最终返回的结果。

思路四:

摩尔投票算法,先将第一个数字假设为众数,然后把计数器设为1,比较下一个数和此数是否相等,若相等则计数器加一,反之减一。然后看此时计数器的值,若为零,则将当前值设为候选众数。以此类推直到遍历完整个数组,当前候选众数即为该数组的众数。

代码实现packageArray;importjava.util.HashMap;/***169.MajorityElement(求众数)*给定一个大小为n的数组,找到其中的众数。众数是指在数组中出现次数大于⌊n/2⌋的元素。*你可以假设数组是非空的,并且给定的数组总是存在众数。*/publicclassSolution169{publicstaticvoidmain(String[]args){Solution169solution169=newSolution169();int[]nums=newint[]{3,2,3};System.out.println(solution169.majorityElement_4(nums));}/***利用哈希表的映射,储存数组中的数字以及它们出现的次数,当众数出现时,返回这个数字。**@paramnums*@return*/publicintmajorityElement(int[]nums){HashMap<Integer,Integer>map=newHashMap<>();for(intnum:nums){Integercnt=map.get(num);if(cnt==null){cnt=1;}else{cnt++;}if(cnt>nums.length/2){returnnum;}map.put(num,cnt);}return0;}/***因为众数是出现次数大于n/2的数字,所以排序之后中间的那个数字一定是众数。即nums[n/2]为众数。但是在计算比较大的数组时,时间会超过限制。**@paramnums*@return*/publicintmajorityElement_2(int[]nums){intn=nums.length;for(inti=0;i<n-1;i++){for(intj=0;j<n-1-i;j++){if(nums[j]>nums[j+1]){inttemp=nums[j];nums[j]=nums[j+1];nums[j+1]=temp;}}}returnnums[n/2];}/***分治法,将整个数组分成两个部分,先分别筛选出这两部分中出现次数最多的数,记为left和right,如果left等于right,则返回left*如果left不等于right,则left和right都是最终结果的候选,此时需要遍历整个数组考察left和right出现的次数,出现次数较多的就是最终返回的结果。**@paramnums*@return*/publicintmajorityElement_3(int[]nums){returnfind(nums,0,nums.length-1);}publicintfind(int[]nums,intbegin,intend){if(begin==end){returnnums[begin];}else{intmid=(begin+end)/2;intleft=find(nums,begin,mid);intright=find(nums,mid+1,end);//左右两部分的众数相同则这个数是这部分的众数if(left==right){returnleft;}else{//左右两部分的众数不相同则这两个数都有可能是这部分的众数,那么遍历这个数组,看一下哪个数字的出现次数多intcountLeft=0;intcountRight=0;for(inti=begin;i<=end;i++){if(nums[i]==left){countLeft++;}elseif(nums[i]==right){countRight++;}}if(countLeft>countRight){returnleft;}else{returnright;}}}}/***摩尔投票算法,先将第一个数字假设为众数,然后把计数器设为1,比较下一个数和此数是否相等,若相等则计数器加一,反之减一。*然后看此时计数器的值,若为零,则将当前值设为候选众数。以此类推直到遍历完整个数组,当前候选众数即为该数组的众数。**@paramnums*@return*/publicintmajorityElement_4(int[]nums){intmaj=nums[0];intcount=1;for(intnum:nums){if(maj==num){count++;}else{count--;if(count==0){maj=num;count=1;}}}returnmaj;}}posted@2018-09-0116:24武培轩阅读(...)评论(...)编辑收藏

普通会员

2

帖子

298

回复

311

积分
沙发
发表于 2024-03-27 23:19:58

爱你呦

您需要登录后才可以回帖 登录 | 立即注册

触屏版| 电脑版

技术支持 历史网 V2.0 © 2016-2017