JS长度最小的子数组

文章目录

🐬题目

力扣题目链接(opens new window)

给定一个含有 n 个正整数的数组和一个正整数 s ,找出该数组中满足其和 ≥ s 的长度最小的 连续 子数组,并返回其长度。如果不存在符合条件的子数组,返回 0。

示例:

  • 输入:s = 7, nums = 2,3,1,2,4,3
  • 输出:2
  • 解释:子数组 4,3 是该条件下的长度最小的子数组。

提示:

  • 1 <= target <= 10^9
  • 1 <= nums.length <= 10^5
  • 1 <= numsi <= 10^5

🦈思路

这道题连两个for暴力解决法都过时了,想不到任何思路。于是我参考了网上的资料,发现可以用滑动窗口实现。

所谓滑动窗口,就是不断的调节子序列的起始位置和终止位置,从而得出我们要想的结果。

滑动窗口可以用一个for循环解决两个for所要做的事情,我们这时就需要考虑for(let j...)里面的 j 应该是起始位置还是终止位置呢?如果是起始位置的话,那跟两个for有什么区别呢?

所以这里的 j 应该是终止位置,然而滑动窗口的起始位置应该怎么移动呢?

我们拿s=7, 数组是 2,3,1,2,4,3来举例

最后找到 4,3 是最短距离。

看到这里,感觉跟双指针一样!也可以理解为滑动窗口是双指针法的一种。

🐙滑动窗口

js 复制代码
/**
 * 查找和大于等于目标值的最小子数组长度
 *
 * @param target 目标值
 * @param nums 整数数组
 * @returns 返回满足条件的最小子数组长度,若不存在则返回0
 */
function minSubArrayLen(target, nums) {
  let i = 0,
    sum = 0,
    subLen = 0,
    result = Infinity;
  for (let j = 0; j < nums.length; j++) {
    sum += nums[j];
    while (sum >= target) {
      subLen = j - i + 1;
      // 比较长度,取最小值
      result = result < subLen ? result : subLen;
      sum -= nums[i];
      i++;
    }
  }
  return result === Infinity ? 0 : result;
}
const arr = [2, 3, 1, 2, 4, 3];
console.log(minSubArrayLen(7, arr));
  • 时间复杂度:O(n),其中 n 是数组的长度。指针 start 和 end 最多各移动 n 次。
  • 空间复杂度:O(1)。

🐠总结

在本题中实现滑动窗口,主要确定如下三点:

  • 窗口内是什么?sum≥target的长度最小的 连续 子数组。
  • 如何移动窗口的起始位置?当sum≥target时,就要移动
  • 如何移动窗口的结束位置?for循环遍历的索引

滑动窗口的精妙之处在于根据当前子序列和大小的情况,不断调节子序列的起始位置。从而将O(n^2)暴力解法降为O(n)。

参考笔记:代码随想录

相关推荐
fangzhanpeng1684 天前
快速掌握C#语言基础知识点(1.基础数据类型)
开发语言·c#·1024程序员节
无己心7 天前
面向多平台 AI 搜索引擎的适配层架构设计
前端·人工智能·搜索引擎·ai·1024程序员节
u01030552713 天前
AI驱动的安卓UI自动生成功能实现
人工智能·1024程序员节
u01030552713 天前
长株潭智能体赋能腾讯元器链接共享
1024程序员节
云贝贝贝14 天前
OceanBase认证体系介绍与备考指南
运维·服务器·oceanbase·1024程序员节
u01030552715 天前
Java图像处理实战指南
人工智能·1024程序员节
u01030552715 天前
Java AWT鼠标事件全解析
人工智能·1024程序员节
u01030552717 天前
Java实用类应用精讲
人工智能·1024程序员节
u01030552718 天前
Java I/O核心操作实战
人工智能·1024程序员节
u01030552719 天前
ArrayList操作详解与实战应用
人工智能·1024程序员节