题目描述:
给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
示例:
输入: [-2,1,-3,4,-1,2,1,-5,4],
输出: 6
解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/maximum-subarray
代码实现
def maxSubArray(nums): ''' 找出和最大的连续子数组,返回和,动态规划策略 :param nums: :return: ''' pre = 0 # 表示当前元素结尾的子数组之和 tmp_res = [] # 存放当前元素结尾的子数组之和 for num in nums: pre = max(pre + num, num) tmp_res.append(pre) return max(tmp_res) print("----------测试maxSubArray()----------") nums = [-2, 1, -3, 4, -1, 2, 1, -5, 4] res = maxSubArray(nums) print("res=", res) def maxSubArray1(nums): ''' 找出和最大的连续子数组,返回和,动态规划策略 :param nums: :return: ''' pre = 0 # 表示当前元素结尾的子数组之和 # tmp_res = [] # 存放当前元素结尾的子数组之和 maxAns = float('-inf') # 表示子数组最大值 for num in nums: pre = max(pre + num, num) maxAns = max(maxAns, pre) # tmp_res.append(pre) return maxAns print("----------测试maxSubArray1()----------") nums = [-1] res = maxSubArray1(nums) print("res=", res)
总结:这是一道数组与动态规划相结合的题目,但解题思路还是以动态规划为主。主要思想即是求出以当前元素结尾的子数组之和cur_sum,如果cur_num>0,则对增加下一个元素结尾之和有意义;反之无意义。方法1将各元素结尾之和存入arr,最后求arr最大值即可。方法2与1殊途同归,思想相同,只不过在实现上减少了空间复杂度到O(1),方法1空间复杂度为O(n)