一、最大子数组和
给你一个整数数组 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
1.Java解答
class Solution {
public int maxSubArray(int[] nums) {
int ans =nums[0];
int sum =0;
for(int num:nums){
if(sum>0){
sum+=num;
}
else{
sum =num;
}
ans =Math.max(ans,sum);
}
return ans;
}
}
2.python解答
class Solution:
def maxSubArray(self, nums: List[int]) -> int:
for i in range(1, len(nums)):
nums[i] += max(nums[i - 1], 0)
return max(nums)
3.主要思想
Kadane算法是一种用于解决最大子数组和问题的动态规划算法。最大子数组和问题是指在一个数组中找到一个连续的子数组,使得子数组的元素之和最大。
算法的基本思想是遍历数组中的每个元素,同时维护两个变量:
- 当前子数组和 (
current_sum
): 表示以当前元素结尾的子数组的最大和。 - 全局最大和 (
max_sum
): 表示已经遍历过的子数组的最大和。
在遍历数组的过程中,对于每个元素,可以做出以下决策:
- 将当前元素加入当前子数组中,从而扩展当前子数组。
- 以当前元素为起点开始一个新的子数组。
Kadane算法的关键在于通过比较当前元素和当前元素加上前一个元素的和来更新当前子数组和。具体算法步骤如下:
- 初始化
current_sum
和max_sum
为数组中第一个元素的值。 - 从数组的第二个元素开始遍历:
- 更新
current_sum
为当前元素和current_sum + 当前元素
中的较大值。 - 更新
max_sum
为current_sum
和max_sum
中的较大值。
- 更新
- 遍历完成后,
max_sum
即为数组中的最大子数组和。
Kadane算法的时间复杂度为O(n),其中n是数组的长度,因此它是一种高效的解决方案。