每日一题 21.02.20 697. 数组的度 java题解

这篇博客介绍了如何利用哈希表解决LeetCode上的《数组的度的最大值》问题。通过维护一个哈希表,存储每个元素出现的次数、首次出现和最后出现的位置,然后找出出现次数最多且位置差最小的元素,从而得到最短连续子数组的长度。该方法的时间复杂度为O(N),空间复杂度为O(N)。
摘要由CSDN通过智能技术生成

也没想到

题目

https://leetcode-cn.com/problems/degree-of-an-array/
在这里插入图片描述

分析

我们使用哈希表实现该功能,每一个数映射到一个长度为 3 的数组,数组中的三个元素分别代表这个数出现的次数、这个数在原数组中第一次出现的位置和这个数在原数组中最后一次出现的位置。当我们记录完所有信息后,我们需要遍历该哈希表,找到元素出现次数最多,且前后位置差最小的数。

代码

class Solution {
    public int findShortestSubArray(int[] nums) {
        int len=nums.length;
        HashMap<Integer,int[]> map=new HashMap<>();//次数,第一次,最后一次
        int max_count=1;
        for(int i=0;i<len;i++){
            if(map.containsKey(nums[i])){
                int[] abc=map.get(nums[i]);
                int a=abc[0];
                a++;
                max_count=Math.max(max_count,a);
                int b=abc[1];
                int c=abc[2];
                c=i;
                map.put(nums[i],new int[]{a,b,c});
            }
            else{
                int a=1;
                int b=i;
                int c=i;
                map.put(nums[i],new int[]{a,b,c});                
            }
        }
        int min_len=Integer.MAX_VALUE;
        for(int[] abc:map.values()){
            int a=abc[0];
            int b=abc[1];
            int c=abc[2];
            if(a==max_count){
                min_len=Math.min(min_len,c-b+1);
            }
        }
        return min_len;
    }
}

复杂度

时间复杂度O(N):遍历原数组和哈希表一次
空间复杂度O(N)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值