LeetCode第169题——多数元素(Java)

文章讨论了如何在给定数组中找到多数元素,即出现次数超过数组长度一半的元素。首先提出使用哈希映射存储元素及其出现次数,然后优化为使用计数器策略,通过迭代数组并更新多数元素的计数,当计数归零时替换多数元素。这种方法提高了查找效率。
摘要由CSDN通过智能技术生成

题目描述

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

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

示例 1:

输入:nums = [3,2,3]
输出:3

示例 2:

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

未看题解前自己的解决方案

思路

  • 使用map集合来存储<数字,数字出现个数>,这样最多只要遍历一遍数组就可以得到所有数字及其出现次数
  • 因为只要出现次数count大于[n/2]的元素就可以划分为多数元素,那么只要在每一次count++的时候判断是否count > n/2,符合的话结束遍历数组,直接返回count对应的数字,即找到了多数元素

代码

class Solution {
    public int majorityElement(int[] nums) {
        Map<Integer,Integer> map = new HashMap<>();
        if(nums.length <= 1)
            return nums[0];
        for(int i=0;i<nums.length;i++){
            Integer count = map.get(nums[i]);
            if(count == null){
                map.put(nums[i],1);
            }
            else {
                if (count+1 > nums.length/2)
                    return nums[i];
                map.put(nums[i], count + 1);
            }
        }
        return -1;
    }
}

在这里插入图片描述

  • 但是发现题目解是解出了,但是时间复杂度和空间复杂度都不小,于是参考题解优化解决方案

优化后的解决方案

思路

  • 多数元素的定义是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。那么也就是说多数元素出现的次数是数组内其他所有元素出现的次数之和还要多,那我们可以参考五军拼杀对决的游戏方式,只要一个元素的出现次数减去所有元素的次数后,还能保持count大于0,那么该数就为多数元素

  • 那么定义一个计数器变量count来计数当前多数元素的count(默认0)

  • 那么可以定义一个当前多数元素变量majorityElement表示当前的多数元素(默认数组第一个元素)

  • 遍历数组

    • 1.若count=0 将当前遍历元素代替当前多数元素
    • 2.若当前遍历元素是多数元素,count++
    • 3.否则count–

代码

class Solution {
    public int majorityElement(int[] nums) {
        int majorityElement = nums[0];
        int count = 0; 
        for(int i=0;i<nums.length;i++){
            if(count==0) majorityElement = nums[i];
            if(majorityElement == nums[i]) count++;
            else
                count--;
        }
        return majorityElement;
    }
} 

在这里插入图片描述

  • 发现优化后,查找多数元素的效率提高了不少
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值