【力扣刷题总结之169. 多数元素】

相关标签


一、题目要求

二、题解和代码实现 

1.题解

分治题解

摩尔投票法题解,看视频理解

2.代码实现

代码如下(示例):

//分治
class Solution {
    public int majorityElement(int[] nums) {
        int res = majorityElementvol(nums, 0, nums.length - 1);
        return res;
    }

    public int majorityElementvol(int[] nums,int low, int high){
        // 如果划分的子数组只有一个元素,则这个元素就是多数元素
        if (low == high){
            return nums[low];
        }
        // 如果不是一个元素
        int mid = low +(high-low)/2;
        // 获取左数组的多数元素
        int lowmaxval = majorityElementvol(nums, low, mid);
        // 获取右数组的多数元素
        int highmaxval= majorityElementvol(nums, mid+1, high);
        // 左数组的多数元素与右数组的多数元素相等,则此元素必然是原数组的多数元素
        if (lowmaxval == highmaxval){
            return lowmaxval;
        }
        // 左数组的多数元素与右数组的多数元素不相等
        int lowcount =0;
        int highcount =0;
        // 统计左数组的多数元素的个数,右数组的多数元素的个数
        for (int i = low; i <=high; i++) {
            if (nums[i] ==lowmaxval){
                lowcount++;
            }
            if (nums[i] == highmaxval){
                highcount++;
            }
        }
        // 谁个数多谁就是多数元素
        return lowcount>highcount ?  lowmaxval :highmaxval;
    }
}


//摩尔投票法
class Solution {
    public int majorityElement(int[] nums) {
        if (nums==null || nums.length ==0){
            return -1;
        }
        int val = nums[0];//假设第一个元素是目标
        int count = 1;//初始化它个数


        for (int i = 1; i < nums.length; i++) {
            if (val == nums[i]){//当相同时
                count++;//标记个数增加
            }else if (count==0){//当个数为0时,说明数据都被拼完了 
                count++;//把个数赋重新初始化
                val = nums[i];//假设当前i下标元素为目标值
            }else {//当val 不同num[i]时,并且count不等于0
                count--;//个数-1,和不同的元素拼掉
            }
        }
        //这样超过半数的元素值,最终会留下来
        return val;
    }
}


//hashmap解法
class Solution {
    public int majorityElement(int[] nums) {
        int midVal = nums.length/2;

        HashMap<Integer, Integer> map = new HashMap<>();

        for (int num : nums) {
            if (map.containsKey(num)){
                map.put(num,map.get(num)+1);
            }else {
                map.put(num,1);
            }
        }
        Set<Integer> keySet = map.keySet();
        for (Integer integer : keySet) {
            if (map.get(integer)>midVal){
                return integer;
            }
        }
        return 0;
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值