力扣697(java)-数组的度(简单)

题目:

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

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

示例 1:

输入:nums = [1,2,2,3,1]
输出:2
解释:
输入数组的度是 2 ,因为元素 1 和 2 的出现频数最大,均为 2 。
连续子数组里面拥有相同度的有如下所示:
[1, 2, 2, 3, 1], [1, 2, 2, 3], [2, 2, 3, 1], [1, 2, 2], [2, 2, 3], [2, 2]
最短连续子数组 [2, 2] 的长度为 2 ,所以返回 2 。
示例 2:

输入:nums = [1,2,2,3,1,4,2]
输出:6
解释:
数组的度是 3 ,因为元素 2 重复出现 3 次。
所以 [2,2,3,1,4,2] 是最短子数组,因此返回 6 。
 

提示:

nums.length 在 1 到 50,000 范围内。
nums[i] 是一个在 0 到 49,999 范围内的整数。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/degree-of-an-array
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解题思路:

1.定义三个HashMap,分别用来存储元素的度、元素出现的起始位置以及元素出现的末位置到首位值的长度

2.循环遍历整个数组,找到元素出现的次数、起始位置以及长度

3.循环遍历第一个HashMap的value值,找到数组的最大度

4.循环遍历第一个HashMap的key,如果key 对应的value与数组的最大度相等,则通过比较得到最短连续子数组的长度,输出结果

代码:

 1 class Solution {
 2     public int findShortestSubArray(int[] nums) {
 3         int n = nums.length;
 4         //1.考虑特殊情况
 5         if(n == 1){
 6             return 1;
 7         }
 8         //2.定义三个HashMap
 9         Map<Integer, Integer> degree = new HashMap<>();
10         Map<Integer, Integer> first = new HashMap<>();
11         Map<Integer, Integer> last = new HashMap<>();
12         //3.循环数组,找到各元素出现的次数、起始位置和最后出现的长度
13         for(int i = 0; i < n; i++){
14             degree.put(nums[i], degree.getOrDefault(nums[i], 0) + 1);
15             if(!first.containsKey(nums[i])){
16                 first.put(nums[i], i);
17             }
18             last.put(nums[i], i - first.get(nums[i]) + 1);
19         }
20         //4.找到数组的最大度
21         int maxcount  = 0;
22         for(int m : degree.values()){
23             maxcount = Math.max(maxcount, m);
24         }
25         //5.找最短连续子数组
26         int minlength = Integer.MAX_VALUE;
27         for(int key : degree.keySet()){
28             //找到与数组相同的度
29             if(maxcount == degree.get(key)){
30                 minlength = Math.min(minlength, last.get(key));
31             }
32         }
33         return minlength;
34 
35     }
36 }

小知识:

HashMap的基础知识:

HashMap 是一个散列表,它存储的内容是键值对(key-value)映射

1.创建一个HashMap的对象degree,整型(Integer)的key和整型(Integer)的value:

HashMap<Integer, Integer> degree = new HashMap<Integer, Integer>();

2.添加键值对(key-value)可以使用 put() 方法:

degree.put(nums[i], "baidu")

3.使用 get(key) 方法来获取 key 对应的 value:

degree.get(nums[i])

4.使用 remove(key) 方法来删除 key 对应的键值对(key-value):

degree.remove(nums[i]);

5.删除所有键值对(key-value)可以使用 clear 方法:

degree.clear()

6.计算 HashMap 中的元素数量可以使用 size() 方法:

degree.size()

7.迭代HashMap,可以使用 for-each 来迭代 HashMap 中的元素,如果只想获取 key,可以使用 keySet() 方法,然后可以通过 get(key) 获取对应的 value,如果只想获取 value,可以使用 values() 方法。

 for(int key : degree.keySet()){
            //找到与数组相同的度
            if(maxcount == degree.get(key)){
                minlength = Math.min(minlength, last.get(key));
            }
        }

8.检查 hashMap 中是否存在指定的 key 对应的映射关系,使用containsKey(key) 方法

if(!first.containsKey(nums[i])){
                first.put(nums[i], i);
            }

9.获取指定 key 对应对 value,如果找不到 key ,则返回设置的默认值,使用getOrDefault() 方法

degree.getOrDefault( key,defaultValue)

 

posted on 2022-04-06 10:41  我不想一直当菜鸟  阅读(63)  评论(0编辑  收藏  举报