leetCode 169题 多数元素

1.题目描述

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

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

示例:

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

2.解题过程

2.1 第一个思路:首先的一个想法是针对每一个元素统计出现次数,然后取次数最多的元素记下来,代码如下:

public int majorityElement(int[] nums) {
        int maxNum = 0; //记录最大次数
        int target = 0; //记录目标值
        for(int i = 0; i<nums.length;i++){
            int tmp = nums[i];
            int num = 0;
            for (int j = 0; j < nums.length; j++) {
                if(nums[j] == tmp){
                    num ++;
                }
            }
            if(num > maxNum){ //如果次数出现了新高,则更新最大次数和目标值
                target = tmp;
                maxNum = num;
            }
        }
        return target;

    }

分析:算法的时间复杂度是O(n*n),空间复杂度是常量O(1);

改进之处:可以把nums.length用一个变量抽取出来

2.2 第二个思路:利用HsahMap只遍历一次,从而降低时间复杂度,代码如下:

public int majorityElement1(int[] nums) {
        int target = -1; //目标值
        int length = nums.length;
        HashMap<Integer,Integer> hashMap = new HashMap(length/2);
        //hashMap的容量尽量初始化,避免多次扩容。(初始规则:初始值 = 计划实体数 / 0.75)
        for(int i = 0; i < length;i++){
            if(hashMap.containsKey(nums[i])){
                //如果已经包含,次数加一
                hashMap.put(nums[i], hashMap.get(nums[i])+1);
            } else {
                hashMap.put(nums[i], 1);
            }
        }
        
        // 遍历hashMap
        for (Integer integer : hashMap.keySet()) {
            if(hashMap.get(integer) > length/2){
                target = integer;
                break;
            }
        }
        return target;

    }

分析:算法的时间复杂度是O(n),但是用到了HashMap空间复杂度是O(N);

2.3 第三个思路:能否一次遍历就把目标值取出,并且不使用额外的空间?

目标值的出现总次数,减去其他值的出现总次数,结果仍是大于等于1的,有一点动态规划的思想在

public int majorityElement(int[] nums) {
        int num = 1;
        int target = nums[0];
        for(int i = 1; i<nums.length;i++){
            if(nums[i]==target){
                num ++;
            }
            else{
                num--;
            }
            if(num==0){
                target = nums[i];
                num = 1;
            }
        }
        return target;

    }

分析:算法的时间复杂度是O(n),空间复杂度是常量O(1);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值