【LeetCode】169. 多数元素/众数(JAVA)摩尔投票

本文深入探讨了摩尔投票算法,一种用于寻找数组中多数元素的高效算法。通过实例演示了算法的工作原理,即如何在O(n)的时间复杂度和O(1)的空间复杂度下找到众数。

练习题:多数元素/众数

  • 题目要求

      给定一个大小为 n 的数组,找到其中的多数元素。多数元素是指在数组中出现次数大于 ⌊ n/2 ⌋ 的元素。

      你可以假设数组是非空的,并且给定的数组总是存在多数元素。

示例 1:

输入: [3,2,3]
输出: 3
示例 2:

输入: [2,2,1,1,1,2,2]
输出: 2

解:

      摩尔投票算法:

            摩尔投票算法是一种使用线性时间和常数空间查找大部分元素序列的算法。它以1981年出版的Robert S. Boyer和J Strother Moore的名字命名,并且是流式算法的典型例子。

            该算法在其局部变量中创建一个序列元素和一个计数器,该计数器最初为零。然后,它一次处理一个序列元素。在处理元素x时,如果计数器为零,则算法会将x存储为当前的序列元素,并将计数器设置为1。否则,它将x与存储的元素进行比较,或者增加计数器(如果它们相等)或减少计数器(不相等)。在此过程结束时,如果序列具有多数,它将是算法存储的元素。

            通俗点来讲的话,就和我们平时玩的战争游戏差不多。在每个士兵牺牲前会且只会杀死一个敌方士兵,当最后只剩下一方势力的时候,那就一定是士兵数最多的势力。

      那么如何实现呢?

      在这里我先将序列元素a设为数组的第一个数,并将计数器count初值定为0。接着遍历数组,当前元素与a相等时,count++,当前元素与a不相等时,count--。然后判断,当count<0时,将最多的元素a替换为当前元素,count继续置0。最后得到的结果a就是该数组的众数。

代码实现(JAVA):

     public int majorityElement(int[] nums) {
        int a=nums[0];
        int count=0;
        for(int num:nums){
            if(num==a){
                count++;
            }else{
                count--;
                if(count<0){
                a=num;
                count=0;
            }
            }

        }
        return a;
    }

 

题目来源:力扣(LeetCode)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值