题目描述:

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 };

 

 

 

posted on 2018-04-06 12:09  宵夜在哪  阅读(93)  评论(0编辑  收藏  举报