LeetCode - 169. Majority Element

本文介绍了两种寻找数组中多数元素的方法:一种是通过排序,时间复杂度为O(nlogn);另一种是使用Moore投票算法,仅需O(n)的时间复杂度,并且空间复杂度为O(1)。Moore投票算法通过迭代数组并成对消除不同元素来找出可能的多数元素。

第一种方法非常简洁,虽然时间复杂度并不是最小的,为O(nlogn),直接对数组进行排序,然后返回nums[n / 2]即可,代码如下:

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

第二种方法为Moore Voting Algorithm,在算法执行过程中,我们使用常量空间实时记录一个候选元素candidate以及其出现次数count,在开始的时候,candidate设置为数组中的第一个元素,count设置为1,在继续迭代数组的过程中,每找到两个不同的元素,就成对删除,即count--。Moore Voting Algorithm是一个用来寻找majority element的算法,演示在此:http://www.cs.utexas.edu/~moore/best-ideas/mjrty/example.html,时间复杂度为O(n),代码如下:

public class Solution{
    public int majorityElement(int[] nums){
        int candidate = 0;
        int count = 0

        for(int i = 0; i < nums.length; i++){
            if(count == 0){
                candidate = nums[i];
                count = 1;
            }else{
                if(nums[i] == candidate){
                    count++
                }else{
                    count--;
                }
            }
        }
        return candidate;
    }
}


知识点:

1. Moore Voting Algorithm可以记一下

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值