0508_ K 次串联后最大子数组之和

刷了也有一些Leetcode题了,发现动态规划类得题目,大多数都属于中等难度。然而关于动态规划思路之前也一直没琢磨透,今天就来尝试一道动态规划题。

一、先介绍题目背景

给你一个整数数组 arr 和一个整数 k。
首先,我们要对该数组进行修改,即把原数组 arr 重复 k 次。
举个例子,如果 arr = [1, 2] 且 k = 3,那么修改后的数组就是 [1, 2, 1, 2, 1, 2]。
然后,请你返回修改后的数组中的最大的子数组之和。
注意,子数组长度可以是 0,在这种情况下它的总和也是 0。
由于 结果可能会很大,所以需要 模(mod) 10^9 + 7 后再返回。

二、介绍下思路解法

刷多了Leetcode算法题得同学,应该也能一眼看出这种求最大子数组,最大连续元素就是属于很典型得动态规划题目,可以考虑使用动态规划得思路来解题。
那么现在就来详细讲讲动态规划得一个解题思路,其实网上很多内容说的都挺复杂得,对于动态规划大家其实只需要记得,时刻将极值(最大,或者最小值)给保存下来,用一个dp_list存储。例如:【1,3,-1,-2,5】,求最大子数组,那么对应得dp_list为【1+3,1+3-1, 1+3-2, 1+3-1-2+5】,因为这里设置了只要和大于0,则将结果存入dp_list。下面大家可以看看这Leetcode得代码,也可以更加深入得了解动态规划得含义

三、代码过程

def kConcatenationMaxSum(arr, k) -> int:
	"""
	如果dp_list的前一个元素 + arr的这个元素大于0,因为只要大于0,那么加上arr后面的元素,就有可能更大;如果小于0,那么再加后面的元素,只会更小,则用0代替,从新开始求和。
	"""
    arr = arr * k
    # dp_list存储求和结果
    dp_list = [0] * (len(arr)+1)
    for i in range(len(arr)):
        if dp_list[i-1] + arr[i] >= 0:
            dp_list[i] = dp_list[i-1] + arr[i]
        else:
            dp_list[i] = 0
    return max(dp_list)

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值