Leetcode 229 Majority Element II

本文深入探讨了摩尔投票法的原理与应用,这是一种高效寻找数组中多数元素的算法,能够在O(n)时间复杂度和O(1)空间复杂度下解决特定问题。通过抵消概念,文章详细解释了如何在包含多个可能的多数元素的数组中找到它们,并提供了实现代码。

在这里插入图片描述
思路: 这道题我不会做,因为题目要求time complexity为O(n),space complexity为O(1)。看了答案知道这题涉及一个新算法:摩尔投票法。下面给出链接介绍摩尔投票法,讲的还不错:链接。中心思想其实就是抵消。最多只可能有两个majority elements。假设除了这两个数字以外,还有n个其他数字。再假设这两个数字个数分别为i,j。所以我们知道(i + j + n)= 所有数字个数。这时候我们可以得到i - n > 0; j - n > 0。这就是抵消的本质。具体摩尔投票法可以看上面那个链接还是很不错的。下面直接展示代码:

public class Solution {
    public List<Integer> majorityElement(int[] nums) {
        List<Integer> res = new ArrayList<>();
        if(nums.length == 0)
            return res;
            
        int num1 = nums[0]; int num2 = nums[0]; int count1 = 0; int count2 = 0 ;
        
        for (int val : nums) {
            if(val == num1)
                count1++;
            else if (val == num2)
                count2++;
            else if (count1 == 0) {
                num1 = val;
                count1++;
            }
            else if (count2 == 0) {
                num2 = val;
                count2++;
            }
            else {
                count1--;
                count2--;
            }
        }
        count1 = 0;
        count2 = 0;
        for(int val : nums) {
            if(val == num1)
                count1++;
            else if(val == num2)
                count2++;
        }
        if(count1 > nums.length/3)
            res.add(num1);
        if(count2 > nums.length/3)
            res.add(num2);
        return res;
    }
}

总结:无

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值