## 题目地址 https://leetcode.com/problems/minimum-size-subarray-sum/description/ ## 题目描述 ``` Given an array of n positive integers and a positive integer s, find the minimal length of a contiguous subarray of which the sum ≥ s. If there isn't one, return 0 instead. Example: Input: s = 7, nums = [2,3,1,2,4,3] Output: 2 Explanation: the subarray [4,3] has the minimal length under the problem constraint. Follow up: If you have figured out the O(n) solution, try coding another solution of which the time complexity is O(n log n). ``` ## 思路 用滑动窗口来记录序列, 每当滑动窗口中的 sum 超过 s, 就去更新最小值,并根据先进先出的原则更新滑动窗口,直至 sum 刚好小于 s ![209.minimum-size-subarray-sum](../assets/problems/209.minimum-size-subarray-sum.png) > 这道题目和 leetcode 3 号题目有点像,都可以用滑动窗口的思路来解决 ## 关键点 - 滑动窗口简化操作(滑窗口适合用于求解这种要求`连续`的题目) ## 代码 ```js /* * @lc app=leetcode id=209 lang=javascript * * [209] Minimum Size Subarray Sum * * https://leetcode.com/problems/minimum-size-subarray-sum/description/ * * algorithms * Medium (34.31%) * Total Accepted: 166.9K * Total Submissions: 484.9K * Testcase Example: '7\n[2,3,1,2,4,3]' * * Given an array of n positive integers and a positive integer s, find the * minimal length of a contiguous subarray of which the sum ≥ s. If there isn't * one, return 0 instead. * * Example: * * * Input: s = 7, nums = [2,3,1,2,4,3] * Output: 2 * Explanation: the subarray [4,3] has the minimal length under the problem * constraint. * * Follow up: * * If you have figured out the O(n) solution, try coding another solution of * which the time complexity is O(n log n). * */ /** * @param {number} s * @param {number[]} nums * @return {number} */ var minSubArrayLen = function(s, nums) { if (nums.length === 0) return 0; const slideWindow = []; let acc = 0; let min = null; for (let i = 0; i < nums.length + 1; i++) { const num = nums[i]; while (acc >= s) { if (min === null || slideWindow.length < min) { min = slideWindow.length; } acc = acc - slideWindow.shift(); } slideWindow.push(num); acc = slideWindow.reduce((a, b) => a + b, 0); } return min || 0; }; ``` ## 扩展 如果题目要求是 sum = s, 而不是 sum >= s 呢? eg: ```js var minSubArrayLen = function(s, nums) { if (nums.length === 0) return 0; const slideWindow = []; let acc = 0; let min = null; for (let i = 0; i < nums.length + 1; i++) { const num = nums[i]; while (acc > s) { acc = acc - slideWindow.shift(); } if (acc === s) { if (min === null || slideWindow.length < min) { min = slideWindow.length; } slideWindow.shift(); } slideWindow.push(num); acc = slideWindow.reduce((a, b) => a + b, 0); } return min || 0; }; ```