LeetCode 209. Minimum Size Subarray Sum(DP)

题目

题意:求一个数组里最短的连续子序列的和大于等于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;
        
    }
};

二者效率都是差不多的。

猜你喜欢

转载自www.cnblogs.com/dacc123/p/12306370.html
今日推荐