Leetcode-169:求众数

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

思路:

  1. Map存每个数出现次数,大于n/2即为众数
  2. Moore voting alogrithm:每次从数组中找出一对不同的元素,将它们从数组中删除,直到遍历完整个数组。由于这道题已经说明一定存在一个出现次数超过一半的元素,所以遍历完数组后数组中一定会存在至少一个元素。
  3. 分治法,不断把数组分成左右两个数组,分别求两个数组的众数,如果相等则返回此数,如果不等则返回两个数组合并后的真正的众数。
class Solution {
    public int majorityElement(int[] nums) {
        return find(nums,0,nums.length-1);        
    }
    
        public static int find(int[] nums, int begin, int end){
        if (begin == end)
            return nums[begin];
        else {
            int mid = (begin+end)/2;
            int left = find(nums,begin,mid);
            int right = find(nums,mid+1,end);
 
            if(left == right)//左右两部分的众数相同 则这个数是这部分的众数
                return left;
            else{//左右两部分的众数不相同 则这两个数都有可能是这部分的众数
                //那么遍历这个数组 看一下哪个数字的出现频率高
                int countLeft = 0;
                int countRight = 0;
                for (int i = begin; i <= end; i++)
                    if(nums[i] == left)
                        countLeft++;
                    else if (nums[i] == right)
                        countRight++;
 
                if(countLeft>countRight)
                    return left;
                else
                    return right;
            }
        }
    }
 
    
}
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 写在前沿:本文代码均使用C语言编写。 Description:给定一个大小为n的数组,找到其中的众数。众数是指在数...
    小黄大大阅读 3,627评论 0 1
  • 题目 https://leetcode-cn.com/problems/majority-element/ 给定一...
    FlyCharles阅读 1,079评论 0 0
  • 一些概念 数据结构就是研究数据的逻辑结构和物理结构以及它们之间相互关系,并对这种结构定义相应的运算,而且确保经过这...
    Winterfell_Z阅读 11,397评论 0 13
  • GIthub简书CSDN 题目 给定一个大小为 n 的数组,找到其中的众数。众数是指在数组中出现次数大于 ⌊ n/...
    MaosongRan阅读 4,447评论 0 0
  • 开始容易坚持难,至今已经坚持简书145天,回头看自己简书内容,实在没什么可圈可点之处。当初,也就是为了培养自己一个...
    好肚油肚_008阅读 864评论 0 1