【46.多数元素】

16 阅读1分钟

题目

给定一个大小为 n **的数组 nums ,返回其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。

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

示例 1:

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

题解

方式一:哈希表

找出每个元素出现的次数,返回出现次数最多的
复杂度:O(n)

public int majorityElement(int[] nums) {
    // 用于记录每个元素出现的次数
    HashMap<Integer, Integer> countMap = new HashMap<>();
    // 遍历数组
    for (int num: nums) {
        // 如果元素已经在 map 中,将其出现次数加 1
        countMap.put(num, countMap.getOrDefault(num, 0) + 1);
    }
    // 用于记录出现次数最多的元素
    int result = nums[0];
    // 用于记录出现的最大次数
    int count = 0;
    // 遍历 map 找出出现次数最多的元素
    for (Map.Entry<Integer, Integer> entry: countMap.entrySet()) {
        if (entry.getValue() > count) {
            result = entry.getKey();
            count = entry.getValue();
        }
    }
    return result;
}

方式二:摩尔投票法

不好验证正确性

摩尔投票法的核心思想是在每一轮投票过程中,从数组中找出一对不同的元素并将其从数组中删除,直到数组为空或只有一种元素。由于多数元素的数量超过数组长度的一半,所以最后剩下的元素必然是多数元素

public int majorityElement(int[] nums) {
    // 初始化众数为数组的第一个元素
    int candidate = nums[0];
    // 初始化票数为 1
    int count = 1;
    // 遍历数组
    for (int i = 1; i < nums.length; i++) {
        if (nums[i] == candidate) {
            // 如果当前元素等于众数,票数加 1
            count++;
        } else {
            // 如果当前元素不等于众数,票数减 1
            count--;
            if (count == 0) {
                // 如果票数为 0,更换众数为当前元素,并将票数重置为 1
                candidate = nums[i];
                count = 1;
            }
        }
    }
    return candidate;
}

总结

哈希表