【每日一题】leetCode 169. 多数元素

本文介绍了三种解决给定数组中多数元素问题的方法:排序查找、哈希映射计数和摩尔投票法。排序法适用于小规模数组,哈希映射适用于简单计数,而摩尔投票法则提供了时间复杂度和空间复杂度最优的解决方案。
摘要由CSDN通过智能技术生成

169. 多数元素

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

你可以假设数组是非空的,并且给定的数组总是存在多数元素。
解法一
如果一个数出现次数大于总数的1/2那么最中间的数一定复合条件

class Solution {
    public int majorityElement(int[] nums) {
        
        //排序,然后找到中间的数
        Arrays.sort(nums);
        int length = nums.length;
        
        return nums[length/2];
    }
}

解法二
关于元素数量的问题我们很容易想到使用hashmap的特性进行求解,key为nums[i],value为出现的次数

class Solution {
    public int majorityElement(int[] nums) {
        Map<Integer, Integer> map = new HashMap<Integer, Integer>();
        int ans = 0;
        for(int i = 0; i < nums.length; i++){
            if (!map.containsKey(nums[i])){
                map.put(nums[i], 1);
            } else {
                map.put(nums[i], map.get(nums[i])+1);
            }
            //如果value大于nums.length/2则为找到这个数
            if (map.get(nums[i]) > nums.length/2) {
                ans = nums[i];
                break;
            }
        }
        return ans;
    }
}

解法三
使用摩尔投票法进行解题,核心理念为 票数正负抵消 。此方法时间和空间复杂度分别为 O(N)O(N)O(N) 和 O(1)O(1)O(1) ,为本题的最佳解法。

class Solution {
    public int majorityElement(int[] nums) {
         int count = 0;
        Integer flag = null;
        for( int num:nums){
            if(count ==0){
                flag=num;
            }
            if(num==flag){
                count++;
            }else{
                count--;
            }
        }
        return flag;
    }
}
  • 9
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值