169. Majority Element

本文介绍了一种寻找数组中多数元素的算法,多数元素是指在数组中出现次数超过一半的元素。文章提供了三种不同时间复杂度的解决方案:排序、哈希表计数及Boyer-Moore投票算法,并对每种方法进行了详细解析。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Given an array of size n, find the majority element. The majority element is the element that appears more than ⌊ n/2 ⌋ times.

You may assume that the array is non-empty and the majority element always exist in the array.


1.首先想到的解法是先sort 之后返回中间的值就可以了 类似滑动窗口 滑动窗口的长度>2/n 所以无论怎么移动 都会覆盖掉中间的值

比如 1,2,3,1,1,2,1,1 排序之后 1,1,1,1,1,2,2,3 中间的位置一定会被majority element占据

时间复杂度较高 用到了排序 O(nlgn)

2.比O(nlgn)低的时间复杂度 就是O(n)了 也就是扫描

做法是用一个map<Integer, Integer>记录数字和对应的出现次数

    public int majorityElement(int[] nums) {
        Map<Integer, Integer> map = new HashMap<>();
        for (int n : nums) {
            int count = map.getOrDefault(n, 0) + 1;
            if (count > nums.length/2) return n;
            map.put(n, count);
        }
        return -1;
    }
但是空间复杂度较高 O(n)
3.降低空间复杂度 也就是去掉map 

这里是用的是类似"抵消"思想 

先拿nums[0]作为majority element,此时majority的count=1

之后后面的元素如果等于nums[0],count+1;不等于nums[0],count-1

如果count=0了,说明到目前为止,不等于nums[0]的多于等于nums[0]的,那么majority element进行重新选举

如果nums[0]真的是majority element,只是前面出现的次数很少,后面出现的次数很多,没关系,nums[0]肯定还会被再次选中

public int majorityElement(int[] nums) {
    int count = 0, major = 0;
    for (int i=0; i<nums.length; i++) {
        if (count==0) {
            major = nums[i];
        }
        if (nums[i]!=major) {
            count--;
        } else {
            count++;
        }
    }
    return major;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值