LeetCode209 長度最小的子陣列

2022-08-11 09:33:09 字數 1842 閱讀 6784

暴力列舉所有可能的子陣列,也就是枚舉子陣列的所有開始下標和結束下標,計算子陣列的和,如果子陣列的和小於等於s,就更新最小長度。

class solution 

int res = int_max; //最終的返回結果,初始化為乙個較大的數

for(int i = 0; i < nums.size(); ++i) }}

return res == int_max ? 0 : res;}};

同樣是枚舉子陣列的起始下標,我們考慮優化子陣列結束下標的搜尋空間,如果能用二分找到(滿足子陣列的和大於等於s)子陣列結束下標的位置,相比於方法一就會更快,

二分查詢要求陣列是單調的,由於題目保證每乙個元素都是正的,所以我們考慮用乙個sums陣列記錄字首和,也就是說,sums[i]表示nums[0] ~ nums[i - 1]的元素總和,

這樣,問題就轉化為對於每乙個起始下標i,通過二分查詢尋找乙個大於等於i的最小下標bound,使得sums[bound] - sums[i - 1] >= s,sums[bound] - sums[i - 1]就是子陣列的和。找到了bound之後,我們就更新子陣列的最小長度(此時子陣列的長度是bound - (i - 1))。

class solution 

int size = nums.size();

vectorsums(size + 1, 0); //這裡sums的大小為size + 1,是因為我們要讓sums[0]為0,方便下一句的for迴圈對suns做初始化

for(int i = 1; i <= size; ++i)

int res = int_max;

for(int i = 1; i <= size; ++i)

}return res == int_max ? 0 : res;}};

考慮用雙指標,兩個指標start和end分別表示子陣列的開始和結束下標,變數sum表示以start開頭,以end結尾的子陣列的和。start, end, sum的初始值都為0.

先將nums[end]加入sum中,如果sum < s,就繼續增加end(當然同時也把nums[end]加入sum)直到sum >= s,此時不增加end,而是更新子陣列的最小長度(此時長度為end - start + 1),然後不斷增加start(並更新子陣列的最小長度)直到sum < s,然後再繼續增加end,直到end超過了陣列最大下標。

class solution 

int start = 0, end = 0, sum = 0, res = int_max;

while(end < nums.size())

++end;

}return res == int_max ? 0 : res;}};

暴力方法中列舉起始下標需要o(n),內層迴圈列舉結束下標又需要o(n),因此時間複雜度是o(n);由於無需額外的輔助陣列,因此空間複雜度是o(1);

字首和 + 二分查詢同樣需要o(n)來列舉起始下標,但這裡對於子陣列的結束下標使用了二分查詢進行優化,查詢的複雜度是o(logn),因此總的時間複雜度是o(nlogn);由於需要乙個額外陣列sums存放字首和,因此空間複雜度是o(n);

雙指標方法中,左右指標start和end都只會向右移動,並且對於每個起始下標,無需從頭開始列舉結束下標,因此時間複雜度是o(n);雙指標方法也無需額外的輔助陣列,空間複雜度為o(1).

leetcode 209 長度最小的陣列

題目描述 給定乙個含有 n 個正整數的陣列和乙個正整數 s 找出該陣列中滿足其和 s 的長度最小的連續子陣列。如果不存在符合條件的連續子陣列,返回 0。參考 負雪明燭 class solution object def minsubarraylen self,s,nums type s int ty...

LeetCode 209 長度最小的子陣列

題目鏈結 題目描述 給定乙個含有 n 個正整數的陣列和乙個正整數 s 找出該陣列中滿足其和 s 的長度最小的連續子陣列。如果不存在符合條件的連續子陣列,返回 0。示例輸入 s 7,nums 2,3,1,2,4,3 輸出 2 解釋 子陣列 4,3 是該條件下的長度最小的連續子陣列。解決方法 兩種方法 ...

Leetcode209 長度最小的子陣列

給定乙個含有 n 個正整數的陣列和乙個正整數 s 找出該陣列中滿足其和 s 的長度最小的連續子陣列。如果不存在符合條件的連續子陣列,返回 0。示例 輸入 s 7,nums 2,3,1,2,4,3 輸出 2 解釋 子陣列 4,3 是該條件下的長度最小的連續子陣列。public intminsubarr...