Majority Element

本文介绍了LeetCode上多数元素问题的不同解法,包括排序法、摩尔投票算法、HashMap计数法及按位操作法。其中摩尔投票算法能在O(n)时间内解决此问题。

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

https://oj.leetcode.com/problems/majority-element/

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.

解题思路:

这道题的解法较多,完成后在题目的solution里可以看到总结了很多种不同的方法。

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

上面是最容易想到的排序,排序完成后,majority element不管大小,一定在最中间。

public class Solution {
    public int majorityElement(int[] num) {
        int candidate = num[0];
        int counter = 0;
        for(int i = 1; i < num.length; i ++){
            if(num[i] == candidate){
                counter++;
            }else {
                if(counter > 0){
                    counter--;
                }else{
                    candidate = num[i];
                }
            }
        }
        return candidate;
    }
}

这是一个所谓的摩尔投票算法,可以在线性时间O(n)内解决问题。这也是一个很容易就想到的算法,不过需要总结一下才能写出。类似于不同的元素就抵消,相同的用一个数字计数的思想。基本思想是,用两个变量,candidate存前一个遍历的元素,counter用来计数。从头遍历数组,如果candidate和当前元素相同,candidate不变,counter++。如果candidate和当前元素不同,但是counter>0证明,这个candidate前面已经出现很多次了,那么counter--,抵消一次,直到counter==0。所以如果candidate和当前元素不同,而且counter==0,证明这个candidate已经被抵消了,就当前匀速取代这个candidate。如此往复,遍历整个数组。

当然,也可以用hashmap对每个元素计数,可以在线性时间内解决问题。

题目的solution里面还给到一种按位操作的方法。建立一个大小为32的数组,将原数组每个数字的每位为1的数量存入这个数组。因为majorit element的数量超过一半,那么1的数量大于一半的一定是majori element的1,0的数量大于一半的,也一定是majori elemen的0。如此还原出那个majori elemen。

转载于:https://www.cnblogs.com/NickyYe/p/4231000.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值