1. 程式人生 > >leetcode-209-長度最小的子數組

leetcode-209-長度最小的子數組

etc class cor 邊界 我們 miss 一個 ons code

題目描述:

給定一個含有 n 個正整數的數組和一個正整數 s ,找出該數組中滿足其和 ≥ s 的長度最小的連續子數組。如果不存在符合條件的連續子數組,返回 0。

示例:

輸入: s = 7, nums = [2,3,1,2,4,3]
輸出: 2
解釋: 子數組 [4,3] 是該條件下的長度最小的連續子數組。

進階:

如果你已經完成了O(n) 時間復雜度的解法, 請嘗試 O(n log n) 時間復雜度的解法。

要完成的函數:

int minSubArrayLen(int s, vector<int>& nums)

說明:

1、這道題給定一個正整數s,和一個包含正整數的vector,要求在vector中找到最短長度的連續子數組,這個子數組中所有數的和>=s,返回子數組的長度。

2、這道題不會很難,我們用滑窗的方法找到和>=s的子數組,接著不斷更新最短的長度,最終返回這個最短的長度即可。

最後要考慮一下邊界情況,也就是當滑窗到達vector末尾了怎麽處理,和vector中沒有元素的情況。

代碼如下:(附詳解)

    int minSubArrayLen(int s, vector<int>& nums) 
    {
        if(nums.empty())return 0;//vector中沒有元素,找不到滿足條件的子數組,返回0
        int start=0,end=0,s1=nums.size(),sum=nums[0],record=INT_MAX;//start表示滑窗的開端,end表示滑窗末端
        while(start<s1)//對開端在vector中的每個位置,都進行考慮
        {
            while(sum<s)//當和小於s時,末端不斷向右走,sum也不斷地加
            {
                end++;
                if(end==s1)//如果超出vector的長度,那麽當前滑窗不滿足條件的,這個時候也就可以返回record了
                    return record==INT_MAX?0:record;//如果record等於初始值,那麽必然沒有改變過record,也就是從頭到尾都沒找到滿足條件的滑窗
                sum+=nums[end];
            }
            record=min(record,end-start+1);//更新record
            sum-=nums[start];//減去開端
            start++;//開端到了下一位
        }
        return record;
        
    }

上述代碼實測8ms,beats 98.44% of cpp submissions。

leetcode-209-長度最小的子數組