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

练习题:多数元素/众数

  • 题目要求

      给定一个大小为 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)

 

你可能感兴趣的:(【LeetCode】169. 多数元素/众数(JAVA)摩尔投票)