Python3-[40]面试题42.连续子数组的最大和(动态规划)A

面试题42.连续子数组的最大和

      • 题目
      • 解题思路
        • 1.状态定义:
        • 2.动态方程:
        • 4.初始化
        • 3.输出:
      • 代码

题目

给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
P.S. 题目来源于leetcode.

解题思路

动态规划解决:

1.状态定义:

dp[i]为以nums[i]结尾的连续子数组的最大和。

2.动态方程:

如果之前的和dp[i-1]小于0,说明dp[i-1]对当前值起到反作用,则舍去之前的和dp[i-1],令nums[i]为当前状态值进行计算。

if dp[i-1]>=0:
    dp[i]=dp[i-1]+nums[i]
else:
    dp[i]=nums[i]

4.初始化

dp可以多出一个元素,并初始化为全0

3.输出:

由于状态dp[i]为以nums[i]结尾的连续子数组的最大和,最后要求最大子序列的最大和,需要取max(dp).

代码

class Solution:
    def maxSubArray(self, nums: List[int]) -> int:
        #动态规划:
        size = len(nums)
        dp = [0 for _ in range(size+1)]#初始化全0(多出一个元素)
        for i in range(1,size+1):
            if dp[i-1] >= 0:
                dp[i] = dp[i-1]+nums[i-1]
            else:
                dp[i] = nums[i-1]
        return max(dp[1:])

你可能感兴趣的:(剑指系列,数据结构与算法,动态规划,动态规划)