郴州建網(wǎng)站百度熱搜seo
個人主頁:兜里有顆棉花糖
歡迎 點贊👍 收藏? 留言? 加關注💓本文由 兜里有顆棉花糖 原創(chuàng)
收錄于專欄【手撕算法系列專欄】【LeetCode】
🍔本專欄旨在提高自己算法能力的同時,記錄一下自己的學習過程,希望對大家有所幫助
🍓希望我們一起努力、成長,共同進步。
點擊直接跳轉(zhuǎn)到該題目
目錄
- 1??題目描述
- 2??算法分析
- 3??代碼編寫
1??題目描述
給定一個含有 n
個正整數(shù)的數(shù)組和一個正整數(shù) target
。
找出該數(shù)組中滿足其總和大于等于 target 的長度最小的 連續(xù)子數(shù)組 [nums[l], nums[l+1], ..., nums[r-1], nums[r]]
,并返回其長度。如果不存在符合條件的子數(shù)組,返回 0 。
示例1:
輸入:target = 7, nums = [2,3,1,2,4,3]
輸出:2
解釋:子數(shù)組 [4,3] 是該條件下的長度最小的子數(shù)組。
示例2:
輸入:target = 4, nums = [1,4,4]
輸出:1
示例3:
輸入:target = 11, nums = [1,1,1,1,1,1,1,1]
輸出:0
注意:
1 <= target <= 10^9
1 <= nums.length <= 10^5
1 <= nums[i] <= 10^5
2??算法分析
解題思路如下:
- 步驟一:使用雙指針left和right來構建滑動窗口,初始時left和right都為0。
- 步驟二:進入循環(huán),將右指針right向右移動,每次將nums[right]的值加到sum中。
- 步驟三:進入while循環(huán),判斷當前窗口內(nèi)的和sum是否大于等于目標值target。如果是,則更新ret為最小值,即min(ret, right - left + 1);然后將左指針left向右移動,并從sum中減去nums[left]。
- 然后循環(huán)步驟二和步驟三,
直到右指針right達到數(shù)組的末尾
;最后返回結果即可。
3??代碼編寫
class Solution {
public:int minSubArrayLen(int target, vector<int>& nums) {int n = nums.size();int ret = INT_MAX, sum = 0;for(int left = 0,right = 0;right < n;right++){// 進窗口sum += nums[right];while(sum >= target){// 更新結果ret = min(ret,right - left + 1);// 出窗口sum -= nums[left++];}}return ret == INT_MAX ? 0 : ret;}
};
最后就是通過啦!!!