本文共 1131 字,大约阅读时间需要 3 分钟。
为了解决这个问题,我们需要找到数组中最大的连续子数组的和。连续子数组最少包含一个元素。这个问题可以通过动态规划的方法高效地解决。
我们可以使用一个数组 maxSub
来存储从每个索引位置开始的最大连续子数组和。初始化时,最后一个元素的 maxSub
值为它本身,因为它作为单独的子数组只能包含自己。
然后,我们从倒数第二个元素向前遍历:
i
,检查将 nums[i]
和 maxSub[i+1]
相加的结果,是否大于 nums[i]
。maxSub[i]
将被更新为这个和;否则,保持 nums[i]
。maxSub[i]
后,检查并更新 maxSub
数组的最大值 result
。这样逐步计算出每个位置开始的最大连续子数组和,最终的 result
就是整个数组的最大子数组和。
public class Solution { public int maxSubArray(int[] nums) { int n = nums.length; int[] maxSub = new int[n]; maxSub[n-1] = nums[n-1]; int result = maxSub[n-1]; for (int i = n - 2; i >= 0; i--) { if (nums[i] + maxSub[i + 1] > nums[i]) { maxSub[i] = nums[i] + maxSub[i + 1]; } else { maxSub[i] = nums[i]; } if (maxSub[i] > result) { result = maxSub[i]; } } return result; }}
maxSub
:长度与 nums
相同,存储每个索引开始的最大连续子数组和。初始值为最后一个元素。maxSub
值,并检查是否为最大值,更新 result
。这种方法的时间复杂度为 O(n),空间复杂度也为 O(n),高效且适用于较大规模数组。
转载地址:http://vegyk.baihongyu.com/