# LeetCode算法学习之- 数组-[697. 数组的度]

82 阅读1分钟

题目

给定一个非空且只包含非负数的整数数组 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

**