黑洞入口:https://leetcode.cn/problems/minimum-size-subarray-sum/
給定一個含有 n 個正整數的數組和一個正整數 target 。
找出該數組中滿足其和 ≥ target 的長度最小的 連續子數組 [numsl, numsl+1, ..., numsr-1, numsr] ,并返回其長度。如果不存在符合條件的子數組,返回 0 。
示例 1:
輸入:target = 7, nums = [2,3,1,2,4,3]
輸出:2
解釋:子數組 [4,3] 是該條件下的長度最小的子數組。
示例 2:
輸入:target = 4, nums = [1,4,4]
輸出:1
示例 3:
輸入:target = 11, nums = [1,1,1,1,1,1,1,1]
輸出:0
提示:
1 <= target <= 109
1 <= nums.length <= 105
1 <= nums[i] <= 105
這個題可以用滑動窗口來做,對于nums來說,只有有子數組(連續的)之和大于target就行了,定義2個變量,一個j用來走前面,一個i走后面,用一個sum來進行(i-j)和的存儲,當sum的值大于target時,我們需要將i進行改動,這里需要注意的是需要用到的是while,不能用if,因為if只能進行一次改動,當你j走的位置的元素比起i和i后面幾個元素之和都大時候就會出現錯誤,整個思路也是比較簡單,因為求的是最小,所以我們需要假設整個子數組的長度足夠大,再通過三目運算符進行改變。
源碼如下:
class Solution { public int minSubArrayLen(int target, int[] nums) { int len = Integer.MAX_VALUE,sum = 0; int i = 0,j = 0; while(j < nums.length) { sum += nums[j]; while(sum >= target) { len = len > j - i + 1? j - i + 1: len; sum -= nums[i++]; } j++; } return len == Integer.MAX_VALUE ? 0:len; } }
浙公網安備 33010602011771號