题目描述:
Given an array of n positive integers and a positive integer s, find the minimal length of a contiguous subarray of which the sum ≥ s. If there isn't one, return 0 instead.
For example, given the array [2,3,1,2,4,3]
and s = 7
,
the subarray [4,3]
has the minimal length under the problem constraint.
解题思路:
第一次做的时候我的思路就是寻找每一个子数组,找到最少元素的那一个。
第二次稍微参考了下别人的思路,重新整理了下代码,这次的思路是相当于用一个动态的子数组在数组上搜索,分别用left和right作为子数组的边界,当子数组中元素和大于等于s时:比较长度,做左边界右移;小于时:右边界右移。
第一次代码:
1 class Solution { 2 public: 3 int minSubArrayLen(int s, vector<int>& nums) { 4 int n = nums.size(), minNum = INT_MAX; 5 for(int i = 0; i < n; i++){ 6 int tSum = 0, j = i; 7 for(; j < n; j++){ 8 tSum += nums[j]; 9 if(tSum >= s) 10 break; 11 } 12 if(tSum >= s) 13 minNum = min(j-i+1, minNum); 14 } 15 if(minNum == INT_MAX) 16 return 0; 17 return minNum; 18 } 19 };
第二次代码:
1 class Solution { 2 public: 3 int minSubArrayLen(int s, vector<int>& nums) { 4 int n = nums.size(), minNum = INT_MAX, left = 0, right = 0; 5 int sum = 0; 6 while(right <= n && left <= right){ 7 //当右边界越界的时候,最后一个元素作为右边界的情况还未遍历,所以时<= 8 if(sum < s){ 9 //小于 10 if(right == n) 11 //最后一个元素是右边界的终止条件 12 break; 13 sum += nums[right++]; 14 } 15 else{ 16 //大于等于 17 minNum = min(right-left, minNum); 18 sum -= nums[left++]; 19 } 20 } 21 if(minNum == INT_MAX) 22 //不存在的情况 23 return 0; 24 return minNum; 25 } 26 };