leetcode-697

题目:

给定一个非空且只包含非负数的整数数组 nums,数组的 度 的定义是指数组里任一元素出现频数的最大值。

你的任务是在 nums 中找到与 nums 拥有相同大小的度的最短连续子数组,返回其长度。

解题思路:

(1)记录数组元素的频数

(2)记录数组元素的起始位置和结束位置

(3)找出频数最大的元素,并计算其最短连续子数组的长度

(4)返回数组的最短连续子数组的长度

第一次的解法:

class Solution {
    public int findShortestSubArray(int[] nums) {
        HashMap<Integer, Integer> Frequency = new HashMap<Integer, Integer>();//记录频率
        HashMap<Integer, Integer> leftSite = new HashMap<Integer, Integer>();//记录左边位置
        HashMap<Integer, Integer> rightSite = new HashMap<Integer, Integer>();//记录右边位置
        int count = nums.length;
        Integer v = 0;
        //初始化
        for(int i = 0; i < nums.length; i++)
        {
            Frequency.put(nums[i], 0);
            leftSite.put(nums[i], -1);
            rightSite.put(nums[i], -1);
        }
        //统计每个数字出现频率
        for(int i = 0; i < nums.length; i++)
        {
            for(Integer j : Frequency.keySet())
            {
                if(j == nums[i])
                {
                    Frequency.replace(j, Frequency.get(j) + 1);
                    //起始位置
                    if(Frequency.get(j) == 1)
                    {
                        leftSite.replace(j, i);
                    }
                    //结束位置
                    if(i > rightSite.get(j))
                    {
                        rightSite.replace(j, i);
                    }
                }
            }
        }
        //找到出现最大的频率
        for(Integer value : Frequency.values())
        {
            if(value >= v)
                v = value;
        }
        //在频率最大的元素中寻找最短连续子数组的长度
        for(Integer i : Frequency.keySet())
        {
            if(Frequency.get(i).equals(v))
            {
                int cur = rightSite.get(i) - leftSite.get(i) + 1;
                if(cur < count)
                {
                    count = cur;
                }
            }
        }
        return count;
    }
}

运行结果:

 

 

注:学习了HashMap的基本用法:

创建HashMap对象      HashMap<keyType, valueType> functionName = new HashMap<keyType, valueType>;

添加key-value元素      put()

获取value值                get(key)

HashMap循环             for(keyType i : functionName.keySet())

                                    for(valueType value : functionName.values())

判断value值是否相等   equals()

后期改进的方向:

(1)将value创建成数组形式,三个HashMap合并成一个

(2)寻找更优化的方法

 

posted @ 2022-07-07 16:05  洋山芋芋  阅读(34)  评论(0)    收藏  举报