LC169.多数元素

这篇博客介绍了两种寻找数组中多数元素的方法。第一种是通过排序,由于多数元素出现次数超过数组长度的一半,排序后位于中间的元素即为多数元素。第二种方法是摩尔投票法,通过不断比较相邻元素并消除非多数元素,最后剩下的元素即为多数元素。两种方法各有特点,适用于不同的场景。
摘要由CSDN通过智能技术生成

题目

点击此处查看题目要求

解题思路

有两种思路:

  • 将数组首先进行排序,因为该题满足:1.一定存在多数元素。2.多数元素出现的次数超过n/2(向下取整)。所以排序后,直接取nums[n/2]即可,因为超过半数,所以中间位置的元素一定是所求的数字。
  • 摩尔投票法,该题满足:1.一定存在多数元素。2.多数元素出现的次数超过n/2(向下取整)。多数元素的数量大于剩下元素的数量,先取一个数为候选的多数元素,为candidate,用count记录在candidate比别的元素出现得多的次数,即,每次出现candidate就把count加一,出现别的数就把count减一,当count为0的时候把candidate变为当前的数并继续操作。最后得到的candidate的值就是多数元素。因为,多数元素的数量是多于其它所有数的和的,如果candidate选定为多数元素,那么count就是在计算多数元素比别的元素出现的次数多多少次,当然最后会是candidate留下来;那如果candidate选错了,选的是别的数,那别的数的计数数目互相抵消掉一部分,剩下的数中多数元素还是占多,最终还是会变回多数元素。

代码1

class Solution {
    //中间蛇法(长于管长一半的蛇,在管道中间砍一刀,一定会砍到蛇)
    public int majorityElement(int[] nums) {
        int n=nums.length;
        Arrays.sort(nums);
        // for(int i=0;i<nums.length;i++){
        //     for(int j=0;j<nums.length-i-1;j++){
        //         if(nums[j]>nums[j+1]){
        //             int tmp;
        //             tmp=nums[j];
        //             nums[j]=nums[j+1];
        //             nums[j+1]=tmp;
        //         }
        //     }
        // }
        // for(int i:nums){
        //     System.out.print(i);
        // }

        return nums[(n/2)];
    }
}

代码2

class Solution {
    //摩尔投票法
    public int majorityElement(int[] nums) {
        int n=nums.length;
        int result;
        int count=1;
        result=nums[0];
        for(int i=1;i<nums.length;i++){
            if(count==0) {
                result=nums[i];
                count=1;
                continue;
            }
            if(nums[i]==result) count++;
            else count--; 
        }

        return result;
    }
}
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值