給定一個(gè)含有 n 個(gè)正整數(shù)的數(shù)組和一個(gè)正整數(shù) s 计露,找出該數(shù)組中滿足其和 ≥ s 的長(zhǎng)度最小的連續(xù)子數(shù)組博脑。如果不存在符合條件的連續(xù)子數(shù)組,返回 0票罐。
示例:
輸入: s = 7, nums = [2,3,1,2,4,3]
輸出: 2
解釋: 子數(shù)組 [4,3] 是該條件下的長(zhǎng)度最小的連續(xù)子數(shù)組叉趣。
這題也是力扣上的一道題,直觀上來說可以用暴力枚舉该押,從第一個(gè)數(shù)字開始往后迭代疗杉,那樣的話復(fù)雜度應(yīng)該是過高了,我這里沒有寫代碼蚕礼,而是直接用的雙指針法烟具。
所謂的雙指針無而非就是定義兩個(gè)指針指向兩個(gè)節(jié)點(diǎn)椭蹄,然后通過判斷關(guān)系來移動(dòng)他們。根據(jù)不同的題意雙指針的設(shè)定也不一樣净赴,但是大概來說的話绳矩,一般設(shè)置雙指針的位置要么是類似滑動(dòng)窗口的,同一起點(diǎn)同一方向移動(dòng)玖翅,要么就是一個(gè)起點(diǎn)一個(gè)終點(diǎn)翼馆,相向而行。
這題由于是求最小的連續(xù)子數(shù)組金度,那顯然是兩個(gè)指針同時(shí)先指向起點(diǎn)应媚。
以數(shù)組為2,3,1,4,3為例子。設(shè)定left,right指向2猜极。我們要求數(shù)組和大于等于7中姜,那么顯然第一個(gè)點(diǎn)是小于7的,不滿足條件要求跟伏,那么就要將right指針右移丢胚,直到left 和 right 構(gòu)成的數(shù)組滿足條件,那么這樣的話就是left為起點(diǎn)的數(shù)組是最短的受扳。將其記錄下來携龟,然后left也向右移動(dòng)一格,這時(shí)left指向3勘高,與前面一樣的進(jìn)行判斷即可峡蟋,如果3為起點(diǎn)滿足條件的數(shù)組長(zhǎng)度比之前的更短,那么就取這個(gè)數(shù)組長(zhǎng)度即可华望,一直遍歷到結(jié)尾蕊蝗。
最后在處理一下特殊情況和邊界即可。 特殊情況其實(shí)就是當(dāng)有一個(gè)值比s更大赖舟,那么返回的肯定是1蓬戚。
class Solution {
public:
int minSubArrayLen(int s, vector<int>& nums) {
int n=nums.size();
if(n==0) return 0;
int left=0,right=0,ans=INT_MAX;
int sum=nums[0];
while(right<n){
if(sum>=s){
int len=right-left+1;
if(len<ans) ans=len;
sum-=nums[left];
left++;
}
else{
right++;
if(right<n)
sum+=nums[right];
}
if(left>right) return 1;
}
if(ans!=INT_MAX) return ans;
return 0;
}
};