java leetcode之[数学问题 简单]169. 多数元素

题目的链接在这里:https://leetcode-cn.com/problems/majority-element/


题目大意

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

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


一、示意图

在这里插入图片描述

二、解题思路

首先一种是直接用中位数 然后还有一种是用摩尔投票数,还有HashMap方法

中位数

代码如下:

class Solution {
    //有一种特别简单的方法 直接排序 然后输出中位数的地方
    public int majorityElement(int[] nums) {
        //先进行边界判断
        if(nums==null)
            return 0;
        Arrays.sort(nums);
        int len=nums.length;
        if(len==1){
            return  nums[0];
        }
        return nums[len/2];
    }
}

在这里插入图片描述

HashMap方法

代码如下:

class Solution {
    public   int  majorityElement(int[] nums) {
        HashMap<Integer, Integer> hashMap = new HashMap<>();
        //先进行边界判断吧
        if(nums.length==1)
            return nums[0];
        //但是HashMap是会把所有的都放进去的哎 可是我们需要的是 那个key value对应的最大值
        //所有都不用选n/2 就选value最大的那个就行了
        int i=0;
        while (i<nums.length){
            if(!hashMap.containsKey(nums[i])){
                //说明key中没有的话
                hashMap.put(nums[i],1);
            }
            else{
                //如果有的话 就需要把对应的value加一了吧 就是这个方法吧 get得到的是value
                int temp=hashMap.get(nums[i]);
                temp++;
                hashMap.put(nums[i],temp);
            }
            i++;
        }
        //然后应该排序找到最大的那个 再输出的是key呀。。。
        //{1=1, 2=2} 说明结果是正确的 但是就怎么输出的问题了 这里 应该是通过value来得到key
        int temp_result=0;
        int temp_value=0;
        for(Integer key:hashMap.keySet()){
            if(hashMap.get(key)>temp_value){
                //这个时候就是通过找到value来找到key
                temp_result=key;
                temp_value=hashMap.get(key);
            }
        }
        //最后应该就是结果了
        return temp_result;
        
    }
}

在这里插入图片描述

Boyer-Moore Majority Vote

代码如下:

class Solution {
     /**
     * 最后就是这个 摩尔投票法 在数组中找到两个不同的元素并删除他们,不断重复此操作,直到数组中元素都相同
     * 那么剩下的元素就是主要元素
     * 按照代码的思路是这样的  先随意确定一个候选元素,当遇到一个和候选元素不同的元素时,两个数量上抵消一个,count-1,一旦
     * count变成0  就重新找一个候选元素。而在这个过程中 遇到和候选元素不同的元素进行抵消的时候,候选元素和当前元素会存在两种情况
     *  1.其中一个真好是主要元素 2.两者都不是主要元素 这样抵消过后 主要元素还是主要元素
     */
    public   int  majorityElement(int[] nums) {
        int n=nums.length;
        int candidate=nums[0],counter=0;
        for(int i:nums){
            if(counter==0){
                //说明没候选的 那就所谓的“随便找一个” 也就是刚开始的时候 就是第一个  之后就是counter等于0 的那个
                candidate=i;
                counter=1;
            }
            else if(candidate==i) {
                //说明这个又多了一个
                counter++;
            }else{
                counter--;
            }
        }
        //应该这个时候就可以返回候选人了吧
        return candidate;

    }
}


在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值