📅  最后修改于: 2023-12-03 14:50:07.467000             🧑  作者: Mango
在数组中,子数组就是原数组的连续一段元素。例如,数组 [1,2,3,4,5] 中的子数组有 [1,2]、[3,4,5] 等。
在一个由数值构成的数组中,找出一个连续的子数组,使得子数组中的元素之和最大,这个最大的和就是最大总和。
举个例子,对于数组 [−2,1,−3,4,−1,2,1,−5,4],它的具有最大总和的子数组为 [4,−1,2,1],其总和为 6。
通常有两种方式来解决这个问题:
枚举所有的连续子数组,并计算它们的总和,从中找出最大的。时间复杂度为 $O(n^2)$。
def maxSubArray(nums):
n = len(nums)
ans = -10000000
for i in range(n):
for j in range(i, n):
sum = 0
for k in range(i, j + 1):
sum += nums[k]
ans = max(ans, sum)
return ans
我们可以用动态规划的思想来求解最大总和的子数组。具体来说,我们定义一个数组 dp[i] 表示以第 i 个元素结尾的子数组的最大总和。这样,原问题的答案就是所有 dp[i] 中的最大值。
状态转移方程为:dp[i] = max(dp[i-1] + nums[i], nums[i])
,即到第 i 个元素为止,最大的子数组要么是第 i 个元素本身,要么包含第 i 个元素。
时间复杂度为 $O(n)$。
def maxSubArray(nums):
n = len(nums)
dp = [0] * n
dp[0] = nums[0]
for i in range(1, n):
dp[i] = max(dp[i-1] + nums[i], nums[i])
return max(dp)
通过以上两种方式的讲解,我们可以看出动态规划是一种更优的解法,它的时间复杂度更低。在算法竞赛或实际应用中,如果数组的长度非常大,暴力搜索的方法就会耗时很长,而动态规划则可以快速解决问题,提高效率。