题目描述
给你一个整数数组
nums
,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。子数组
是数组中的一个连续部分。
示例 1:
输入:nums = [-2,1,-3,4,-1,2,1,-5,4] 输出:6 解释:连续子数组 [4,-1,2,1] 的和最大,为 6 。示例 2:
输入:nums = [1] 输出:1示例 3:
输入:nums = [5,4,-1,7,8] 输出:23
解题思路
这道题目是寻找一个数组中最大子数组的和。最大子数组的和是指数组中任意连续子数组元素的和的最大值。这个问题可以通过Kadane算法来解决,这是一种动态规划的方法。
Kadane算法的核心思想是:
- 初始化两个变量,
pre
表示当前子数组的和,maxAns
表示迄今为止找到的最大子数组和。- 遍历数组,对于每个元素,我们有两种选择:要么将当前元素加入到当前子数组中(即
pre + x
),要么放弃当前子数组,从当前元素开始一个新的子数组(即x
)。- 在每一步,我们更新
pre
为pre + x
和x
中的较大者,这样保证了我们不会错过任何可能的更大子数组和。- 同时,我们更新
maxAns
为maxAns
和pre
中的较大者,以记录迄今为止找到的最大子数组和。- 遍历结束后,
maxAns
就是整个数组中最大子数组的和。
源码实现
class Solution {
public int maxSubArray(int[] nums) {
// 如果数组为空,返回0
if(nums == null){
return 0;
}
// 如果数组只有一个元素,返回该元素
if(nums.length < 2){
return nums[0];
}
// 初始化当前子数组和为0,最大子数组和为数组的第一个元素
int pre = 0, maxAns = nums[0];
// 遍历数组
for (int x : nums) {
// 更新当前子数组和:取当前元素和当前子数组和加当前元素的较大值
pre = Math.max(pre + x, x);
// 更新最大子数组和:取当前最大子数组和和当前子数组和的较大值
maxAns = Math.max(maxAns, pre);
}
// 返回最大子数组和
return maxAns;
}
}
复杂度分析
时间复杂度:O(n),其中 n 是数组
nums
的长度。这是因为我们只需要遍历一次数组。空间复杂度:O(1),我们只需要常数级别的额外空间来存储
pre
和maxAns
两个变量,所以空间复杂度是常数级别的。