准备训练一下自己写动态规划算法的能力,就在LeetCode上找了几个题,其中就有这道。
先不提动态规划,网友的一个解题思路,,给跪了。
class Solution:
def maxSubArray(self, nums: List[int]) -> int:
"""
:type nums: List[int]
:rtype: int
"""
for i in range(1, len(nums)):
nums[i]= nums[i] + max(nums[i-1], 0)
return max(nums)
只三行代码,作者的思路是直接在输入序列上进行改动。
这里我放上了输入数据和程序的数据存储情况。可以看出,这是每走一步都将之前的和加起来,如果和是负数的话那就不加。
我看网上有个形象的解释很有意思。
假设你是一个选择性遗忘的赌徒,数组表示你这几天来赢钱或者输钱,
你用sum来表示这几天来的输赢,
用ans来存储你手里赢到的最多的钱,
如果昨天你手上还是输钱(sum < 0),你忘记它,明天继续赌钱;
如果你手上是赢钱(sum > 0), 你记得,你继续赌钱;
你记得你手气最好的时候
思路一样,但不是代码的解释,这是另一位作者提出的结题思路。
讲道理这可以算是动态规划。
网上一个动态规划的解答是:
def maxSubArray(self, nums: List[int]) -> int:
for i in range(1, len(nums)):
nums[i] = max(nums[i - 1] + nums[i], nums[i])
return max(nums)
我觉得思路一样。
BTW,分治算法也得好好学习。