欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

数组-14-LeetCode169题-多数元素

程序员文章站 2022-03-15 20:32:56
...

LeetCode169题 -> 多数元素

1. 题目描述
  • 给定一个大小为 n 的数组,找到其中的多数元素。多数元素是指在数组中出现次数大于 ⌊ n/2 ⌋ 的元素。可以假设数组是非空的,并且给定的数组总是存在多数元素。

  • 示例

    输入: [3,2,3]
    输出: 3
    
    输入: [2,2,1,1,1,2,2]
    输出: 2
    
2. 解题思路
  • 思路1:HashMap法
    • ①利用HashMap来存储数组中每个元素及出现的次数,键表示nums[i],值表示nums[i]出现的次数;
    • ②遍历数组将数组中的每个元素加入这个HashMap中;
    • ③判断HashMap中大于nums.length/2的值,返回该值对应的键。
  • 思路2:摩尔投票法
    • ①初始一个候选众数candidate,和它出现的次数count;
    • ②遍历数组nums,判断每个元素nums[i]之前,如果count是0,就将candidate的值等于nums[i],然后判断nums[i];
    • ③如果nums[i] == candidate,count加1;否则,count减1;
    • ④nums遍历完后,candidate即为数组的众数。
3. 代码实现
import java.util.HashMap;
import java.util.Map;

public class MajorityElement {
    /**
     * 1.HashMap法
     * @param nums
     * @return
     */
    public static int majorityElement(int[] nums){
        Map<Integer,Integer> map = new HashMap<>();
        int n = nums.length;
        for (int i = 0; i < n; i++) {
            map.put(nums[i],map.getOrDefault(nums[i],0)+1);
            if(map.get(nums[i]) > (n/2)){
                return nums[i];
            }
        }
        return 0;
    }

    /**
     * 2.摩尔投票法
     * @param nums
     * @return
     */
    public static int majorityElement2(int[] nums){
        int candidate = 0;
        int count = 0;
        for (int i = 0; i < nums.length; i++) {
            if(count == 0){
                candidate = nums[i];
            }
            if(nums[i] == candidate){
                count++;
            }else{
                count--;
            }
        }
        return candidate;
    }

    public static void main(String[] args) {
        int[] nums = {2,2,1,1,1,2,2};
        System.out.println(majorityElement2(nums));
    }
}