169-求众数

求众数

题目

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

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

示例 1:

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

示例 2:

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

思路

  • 暴力法,遍历数组,依次记录每个数字出现的次数,然后再遍历次数给出结果
  • 先排序,数组中间的数字一定是众数,排序可以使用快排
  • 摩尔投票法.此法必须用于在必定存在众数的情况下.简而言之,将数组第一个数作为过半数,然后将计数器设置为1,依次遍历,如果下一个数和当前数相同,则加一,反之减一.当计数器为0时更换下一个数为过半数.

代码

  • 暴力法不写代码
  • 先排序,再找众数(应该使用快排,此处省略)
class Solution {
    public int majorityElement(int[] nums) {
        Arrays.sort(nums);
        return nums[nums.length/2];
    }
}
  • 摩尔投票法
class Solution {
    public int majorityElement(int[] nums) {
        int result = nums[0];
        int sum = 1;
        for(int i = 1;i < nums.length;i++){
            if(result == nums[i]){
                sum++;
            }else{
                sum--;
                if(sum == 0){
                    result = nums[i];
                    sum++;
                }
            }
        }
        return result;
    }
}

你可能感兴趣的:(169-求众数)