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 <= nums[i] <= 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)。

参考笔记:代码随想录

相关推荐
数据皮皮侠AI11 小时前
上市公司股票名称相似度(1990-2025)
大数据·人工智能·笔记·区块链·能源·1024程序员节
开开心心就好1 天前
系统清理工具清理缓存日志,启动卸载管理
linux·运维·服务器·神经网络·cnn·pdf·1024程序员节
Evan东少4 天前
[踩坑]笔记本Ubuntu20.04+NvidiaRTX5060驱动+cuda+Pytorch+ROS/Python实现人脸追踪(环境准备)
1024程序员节
不爱编程的小陈5 天前
C/C++每日面试题
面试·职场和发展·1024程序员节
开开心心就好5 天前
右键菜单管理工具,添加程序自定义名称位置
linux·运维·服务器·ci/cd·docker·pdf·1024程序员节
码农三叔6 天前
(4-2-05)Python SDK仓库:MCP服务器端(5)Streamable HTTP传输+Streamable HTTP传输
开发语言·python·http·大模型·1024程序员节·mcp·mcp sdk
西幻凌云10 天前
初始——正则表达式
c++·正则表达式·1024程序员节
启芯硬件10 天前
电源XL6009E1的dieshot细节分析-芯片设计干货
大数据·经验分享·硬件工程·1024程序员节
一颗青果12 天前
单例模式 | 死锁
linux·服务器·单例模式·1024程序员节