最大子数组和

题目描述:

最大子数组和_第1张图片

解题思路:

状态转移思考:

对于题目所求为一长串具有最有最大和的连续子数组

我们可以观察到对于该大问题可以由前面状态递推过来

(我们假设 f[i] 表示取第 i 个数,具有最大和的连续子数组的最大和)

对于长度为n的数组求最有最大和的连续子数组

可以由前n-1个数组的最大和的连续子数组

判断是否需要取第n个数组

dp分析:最大子数组和_第2张图片

简化分析:

因为题目所求为最大值

我们在每一步递推 i 的时候

得出的就已经是 f[i] 的最大值

故每次递推的时候就已经可以取最大值了

不用开 N (N表示有数组有多大)大小的空间

代码详解:

C++未化简版本:

class Solution {
public:
    int maxSubArray(vector& nums) {

      int f[100006];
			int len=nums.size();
			f[0]=nums[0];

			for(int i=1;i

C++化简版本:

class Solution {
public:
    int maxSubArray(vector& nums) {
			int preSum=0,ans=nums[0];

			for(auto i :nums){
				preSum=max(preSum+i,i);
				ans=max(ans,preSum);
			}

			return ans;
    }
};

Python化简版本:

class Solution(object):
    def maxSubArray(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        n=len(nums)
        res=nums[0]
        preSum=nums[0]

        for i in range(1,n):
            preSum=max(preSum+nums[i],nums[i])
            res=max(res,preSum)
        return res

你可能感兴趣的:(每日一题分享,算法,c++,python)