题意:求一个数组里最短的连续子序列的和大于等于s的长度
题解:可以用动态规划,我就是用动态规划过的,但是确实不是最简单的解法,看了题解最简单的是双指针,
双指针
class Solution {
public:
int minSubArrayLen(int s, vector<int>& nums) {
int sum=0;
int left=0;
int ans=INT_MAX;
for(int i=0;i<nums.size();i++)
{
sum+=nums[i];
while(sum>=s)
{
ans=min(ans,i-left+1);
sum-=nums[left];
left++;
}
}
return ans==INT_MAX?0:ans;
}
};
DP
class Solution {
public:
int dp[100005];
int dp2[100005];
int minSubArrayLen(int s, vector<int>& nums) {
int ans=INT_MAX;
if(nums.size()==0)
return 0;
dp[0]=0;
dp2[0]=nums[0];
for(int i=1;i<nums.size();i++)
{
if(nums[i]+dp2[i-1]>=s)
{
int j=0;
int sum=0;
for(j=dp[i-1];j<=i-1;j++)
{
sum+=nums[j];
if(nums[i]+dp2[i-1]-sum<s)
{
break;
}
}
dp[i] = j;
dp2[i] = dp2[i-1] + nums[i] - sum + nums[j];
}
else
{
dp[i]=dp[i-1];
dp2[i]=dp2[i-1]+nums[i];
}
if(dp2[i]>=s)
ans=min(ans,i-dp[i]+1);
}
return ans==INT_MAX?0:ans;
}
};
二者效率都是差不多的。