连续子数组的最大和

题目描述

题目:输入一个整型数组,数组里有正数也有负数。数组中一个或连续的多个整数组成一个子数组。求所有子数组的和的最大值。要求时间复杂度为 O(n)O(n)。

例如,输入的数组为 {1, -2, 3, 10, -4, 7, 2, -5},和最大的子数组为 {3, 10, -4, 7, 2},因此输出为该子数组的和为 18.

思路解析

  • 思路1 遍历所有子数组
  • 思路2 动态规划
F(i):以arr[i]为末尾元素的子数组的和的最大值,子数组的元素的相对位置不变
F(i)=max(F(i-1)+arr[i] , arr[i])

代码

代码1 暴力求解

arr = [1, -2, 3, 10, -4, 7, 2, -5]
# 暴力求解
maxsum = 0
for i in range(len(arr)):
    cursum = 0
    for j in range(i, len(arr)):
        cursum += arr[j]
        if cursum > maxsum:
            maxsum = cursum
print(maxsum)

代码2 动态规划
针对这个问题,递推公式是DP[i] = max{DP[i-1] + A[i],A[i]};既然转移方程出来了,意味着写一层循环就可以解决这个问题。

# 动态规划 1
cursum, maxsum = 0, 0
for i in range(len(arr)):
    if arr[i] > arr[i] + cursum:  # 此时cursum<0
        cursum = arr[i]
    else:
        cursum = arr[i] + cursum
    if cursum > maxsum:
        maxsum = cursum
print(maxsum)

# 动态规划 2
cursum, maxsum = 0, 0
for i in range(len(arr)):
    cursum += arr[i]
    if cursum > maxsum:
        maxsum = cursum
    if cursum < 0:
        cursum = 0
print(maxsum)


# 动态规划 3
cursum, maxsum = 0, 0
for i in range(len(arr)):
    cursum = max(arr[i], arr[i] + cursum)
    maxsum = max(maxsum, cursum)
print(maxsum)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值