题目
Given an array of positive integers nums and a positive integer target, return the minimal length of a
subarray
whose sum is greater than or equal to target. If there is no such subarray, return 0 instead.
Example 1:
Input: target = 7, nums = [2,3,1,2,4,3]
Output: 2
Explanation: The subarray [4,3] has the minimal length under the problem constraint.
Example 2:
Input: target = 4, nums = [1,4,4]
Output: 1
Example 3:
Input: target = 11, nums = [1,1,1,1,1,1,1,1]
Output: 0
Constraints:
1 <= target <= 109
1 <= nums.length <= 105
1 <= nums[i] <= 104
Follow up: If you have figured out the O(n) solution, try coding another solution of which the time complexity is O(n log(n)).
解法分析
可以用暴力解法来进行
时间复杂度是n方
也可以用双指针滑动窗口来进行
时间复杂度是n
但是这题还提供了一个深入的跟进思考
建议再想一个时间复杂度是nlogn的方法
暴力解法在leetcode中会超时
该题需要考虑边界条件以及双循环变量使用时数组的边界越界问题
暴力解法
class Solution {
public:
int minSubArrayLen(int target, vector<int>& nums) {
int max = 0;
for(int i = 0; i < nums.size(); i++){
max += nums[i];
}
if(target > max)
return 0;
else if(target == max)
return nums.size();
else{
int subl; // minimum is 1
int sum;
int minl = 100000;
for(int i = 0; i < nums.size(); i++){
int j = i;
subl = 1;
sum = 0;
sum += nums[i];
while(sum < target && j < nums.size()){
if(j == nums.size()-1)
break;
j++;
sum += nums[j];
subl++;
}
if(sum >= target){
if(subl == 1)
return 1;
if(subl <= minl)
minl = subl;
}
}
return minl;
}
}
};
双指针滑动窗口解法