1、解题思路
- 动态规划:定义 dp[i] 为以 array[i] 结尾的子数组的最大和。状态转移方程:
对于每个 i,如果 dp[i-1] 为正,则 dp[i] = dp[i-1] + array[i]。否则,dp[i] = array[i](即重新开始一个新的子数组)。初始条件:
dp[0] = array[0]。结果:
max_sum 是所有 dp[i] 中的最大值。
- 优化(Kadane算法):使用一个变量 current_sum 代替 dp 数组,记录当前子数组的和。另一个变量 max_sum 记录全局最大子数组和。遍历数组时,更新 current_sum 和 max_sum。
2、代码实现
C++
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param array int整型vector
* @return int整型
*/
int FindGreatestSumOfSubArray(vector<int>& array) {
// write code here
if (array.empty()) {
return 0;
}
int current_sum = array[0];
int max_sum = array[0];
for (int i = 1; i < array.size(); ++i) {
current_sum = max(array[i], current_sum + array[i]);
max_sum = max(max_sum, current_sum);
}
return max_sum;
}
};
Java
import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param array int整型一维数组
* @return int整型
*/
public int FindGreatestSumOfSubArray (int[] array) {
// write code here
if (array.length == 0) return 0;
int current_sum = array[0];
int max_sum = array[0];
for (int i = 1; i < array.length; ++i) {
current_sum = Math.max(array[i], current_sum + array[i]);
max_sum = Math.max(max_sum, current_sum);
}
return max_sum;
}
}
Python
#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
#
# @param array int整型一维数组
# @return int整型
#
class Solution:
def FindGreatestSumOfSubArray(self , array: List[int]) -> int:
# write code here
if not array:
return 0
current_sum = max_sum = array[0]
for num in array[1:]:
current_sum = max(num, current_sum + num)
max_sum = max(max_sum, current_sum)
return max_sum
3、复杂度分析
- 时间复杂度:O(n),仅需遍历数组一次。
- 空间复杂度:O(1),仅使用常数个额外变量。