题目描述
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.
题目大意
给定一个正整数数组和一个数字s,查找该数组中的子数组,要求该子数组中所有数字之和大于等于s,求符合条件的最小子数组中的元素个数,如果不存在该子数组,则返回0 。
示例
E
解题思路
先遍历一遍数组,保存数组中的前缀数字之和(presum[i]:代表0~i的数字之和)。再利用两个指针前后相互移动来查找符合条件的最小的指针之间的差值,也就是两个指针的最小距离。
复杂度分析
时间复杂度:O(n)
空间复杂度:O(n)
代码
class Solution { public: int minSubArrayLen(int s, vector<int>& nums) { int n = nums.size(); vector<int> presum(n + 1, 0); int res = INT_MAX; for(int i = 1, j = 0; i <= n; i++) { //保存0~i的数字之和 presum[i] = presum[i - 1] + nums[i - 1]; //若i~j的数字之和>=s,则递增j来搜寻最小的距离 if(presum[i] - presum[j] >= s) { while(j < i && presum[i] - presum[j] >= s) { res = min(res, i - j); ++j; } } else { continue; } } //若没找到符合条件的子数组,则返回0 if(res == INT_MAX) res = 0; return res; } };