【LeetCode面试经典150题】169. 多数元素

一、题目

  • 169. 多数元素 - 力扣(LeetCode)
  • 给定一个大小为 n 的数组 nums ,返回其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。
  • 你可以假设数组是非空的,并且给定的数组总是存在多数元素。

二、思路

  1. 根据题目对多数元素的定义,多数元素的数量肯定超过数组总元素的一半;
  2. 但是他的存在又是随机的、分散的,要怎么提炼出来呢,将数组排序后中间的值肯定就是要求的结果;
  3. 但是又想到了中位数的问题,如果数组是偶数怎么办,想了一会儿发现想多了,既然多数元素超过数组总元素的一半,那不管怎么取值都会取到这个多数元素,故有方法一
  4. 写代码的时候觉得哈希表很适合解这个题,库库往里塞数据,哪个数据超过总元素一半了直接返回就完事儿了,故有方法二

三、解法

解法一

class Solution {
    public int majorityElement(int[] nums) {
        Arrays.sort(nums);
        return nums[nums.length / 2];
    }
}

解法二

class Solution {
    private HashMap<Integer, Integer> map = new HashMap<>();

    public int majorityElement(int[] nums) {
        int len = nums.length;
        for (int i = 0; i < len; i++) {
            int pre = map.getOrDefault(nums[i], 0) + 1;
            if (pre > len / 2) {
                return nums[i];
            }
            map.put(nums[i], pre);
        }
        return 0;
    }
}

解法三

  • 进阶:尝试设计时间复杂度为 O(n)、空间复杂度为 O(1) 的算法解决此问题。
class Solution {
    public int majorityElement(int[] nums) {
        int candidate = nums[0], count = 0;
        for (int num : nums) {
            if (count == 0) {
                candidate = num;
            }
            count += (num == candidate) ? 1 : -1;
        }
        return candidate;
    }
}

解析:遍历整个数组,同时维护两个变量,count 用于存放当前元素的数量,candidate 用于存放当前遍历到的元素,遇到相同元素时 count + 1,不同元素则 count - 1 ,每当这个变量被扣减为 0 时,下轮循环时将当前元素填入 candidate,可以想象每次遇到不同元素时 count 就会被"抵消"掉一个,而因为多数元素总是比其他所有元素总和多 1,所以"抵消"到最后必剩下一个元素,且该元素为多数元素。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值