leetcode 697. Degree of an Array 数组的度(简单)
一、题目大意
https://leetcode.cn/problems/...
给定一个非空且只包含非负数的整数数组 nums,数组的 度 的定义是指数组里任一元素出现频数的最大值。
你的任务是在 nums 中找到与 nums 拥有相同大小的度的最短连续子数组,返回其长度。
示例 1:
输入:nums = [1,2,2,3,1]示例 2:
输出: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 。
输入: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 697. Degree of an Array 数组的度(简单)】思路:统计每个数字出现的次数,用哈希来建立数字与出现次数的映射,我们要求与该数组有相同度的最小长度子数组,我们要知道每个数字的度,与其首次出现的位置,这样我们要定义两个哈希一个来存出现的次数,一个来存首次出现的位置。我们再定义一个变量degree来表示数组的度。遍历数组当前遍历位置可以看作是最后一次出现的位置即尾位置,累加当前数字出现的次数,如果数字是第一次出现,建立数字与首位置的映射,如果当前数字的出现次数等于degree时,当前位置为尾位置,用endIndex - startIndex + 1来更新结果;如果当前数字的出现次数大于degree,说明之前的结果代表的数字不是出现最多的,直接将结果更新为endIndex - startIndex + 1,然后degree也更新为当前数字出现的次数。
三、解题方法 3.1 Java实现
public class Solution {
public int findShortestSubArray(int[] nums) {
Map countMap = new HashMap<>();
Map firstIdxMap = new HashMap<>();
int ans = nums.length;
int degree = 0;
for (int i = 0;
i < nums.length;
i++) {
int num = nums[i];
countMap.put(num, countMap.getOrDefault(num, 0) + 1);
// 记录首位置
if (countMap.get(num) == 1) {
firstIdxMap.put(num, i);
}if (countMap.get(num) == degree) {
ans = Math.min(ans, i - firstIdxMap.get(num) + 1);
} else if (countMap.get(num) > degree) {
ans = i - firstIdxMap.get(num) + 1;
degree = countMap.get(num);
}
}
return ans;
}
}
四、总结小记
- 2208/8/23 这两天天气不错
推荐阅读
- leetcode 503. Next Greater Element II 下一个更大元素 II(中等)
- leetcode 560. Subarray Sum Equals K 和为 K 的子数组(中等)
- Leetcode 55 - 跳跃游戏
- 436.|436. 寻找右区间--LeetCode_二分
- LeetCode|《LeetCode力扣练习》剑指 Offer 10- I. 斐波那契数列 Java
- leetcode 304. Range Sum Query 2D - Immutable 二维区域和检索 - 矩阵不可变(中等)
- C语言|【九日集训】《LeetCode刷题报告》题解内容 Ⅳ
- leetcode|leetcode 105. 从前序与中序遍历序列构造二叉树 javascript
- leetcode 128. Longest Consecutive Sequence 最长连续序列(中等)
- 算法面试冲刺|Leetcode 算法面试冲刺 热题 HOT 100 刷题(337 338 347 394 399)(六十八)