题目
给定一个非空且只包含非负数的整数数组 nums,数组的 度 的定义是指数组里任一元素出现频数的最大值。
你的任务是在 nums 中找到与 nums 拥有相同大小的度的最短连续子数组,返回其长度。
分析
\1. 最短连续子串 =》 动态滑动窗口+ min
\2. 出现频次=》 map统计 可能有相同频次的元素
解法:数组统计
思想
1. 先使用map 统计最高出现频次的元素
2. 在使用动态滑动窗口来求最小的长度
*/
// @lc code=start
/**
* @param {number[]} nums
* @return {number}
*/
var findShortestSubArray = function (nums) {
let maxCount = 0;
const map = {};
const maxMap = {};
let min = Infinity;
// 求最高频次
for (let i = 0; i < nums.length; i++) {
map[nums[i]] = (map[nums[i]] || 0) + 1;
maxCount = Math.max(maxCount, map[nums[i]]);
}
// 左指针
let j = 0;
for (let i = 0; i < nums.length; i++) {
maxMap[nums[i]] = (maxMap[nums[i]] || 0) + 1;
// 当满足条件的时候 收缩左边界
while (check() && j <= i) {
// 求得最小值
min = Math.min(min, i - j + 1);
maxMap[nums[j]] = (maxMap[nums[j]] || 0) - 1;
j++;
}
}
// 判断是否满足 子数组中包含了最高出现频次
function check() {
const keys = Object.keys(maxMap);
for (let i = 0; i < keys.length; i++) {
if (maxMap[keys[i]] === maxCount) {
return true;
}
}
return false;
}
// 返回最小长度
return min;
};
//时间复杂度:O(n^2)
//空间复杂度:O(n)
总结
今天这道题是主要是练习如何使用map 求解数组 统计频次类题目
大家可以看看我分享的一个专栏(前端搞算法)里面有更多关于算法的题目的分享,希望能够帮到大家,我会尽量保持每天晚上更新,如果喜欢的麻烦帮我点个赞,十分感谢
大家如果对“TS”感兴趣的可以看看我的专栏 (TypeScript常用知识),感谢大家的支持
文章内容目的在于学习讨论与分享学习算法过程中的心得体会,文中部分素材来源网络,如有侵权,请联系删除,邮箱 182450609@qq.com
**