Leetcode-209. 長度最小的子陣列
阿新 • • 發佈:2020-09-18
給定一個含有 n 個正整數的陣列和一個正整數 s ,找出該陣列中滿足其和 ≥ s 的長度最小的 連續 子陣列,並返回其長度。如果不存在符合條件的子陣列,返回 0。
示例:
輸入:s = 7, nums = [2,3,1,2,4,3]
輸出:2
解釋:子陣列 [4,3] 是該條件下的長度最小的子陣列。
#include <iostream> #include <vector> #include <stack> #include <map> #include <string> #include <math.h> #include <cstdlib> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; /** s = 7, nums = [2,3,1,2,4,3] 和為7,需要找到最短的連續子陣列之和大於等於7,此處的連續指的是 陣列下標的連續 思路: 因為需要查詢連續的子陣列,所以silde window是最容易想到的方案 對於window法,此時我們可以設定2個指標,一前一後分別指代滑動視窗的其實位置和終止位置 - 開始的時候,start固定不動,end向後走,直到end走完或者視窗和大於s,此時我們可以得到一個候選的視窗 - 接著stat往前走,不斷改變這個視窗,去尋找最小的視窗大小 **/ class Solution { public: int minSubArrayLen(int s, vector<int>& nums) { int start_idx = 0; int end_idx = 0; int nums_size = nums.size(); int sum = 0; int window_size = INT_MAX; while(start_idx<nums_size && end_idx<nums_size){ while(sum<s && end_idx<nums_size) sum += nums[end_idx++]; while(sum>=s && start_idx<end_idx){ window_size = min(window_size, end_idx - start_idx); sum -= nums[start_idx++]; } } return window_size==INT_MAX ? 0:window_size ; } }; int main(int argc, char const *argv[]){ Solution solu; vector<int> arr = {2,3,1,2,4,3}; cout<<solu.minSubArrayLen(7,arr)<<endl; return 0; }