/**
* @author xienl
* @description NC19 连续子数组的最大和
* @date 2022/7/1
*/
public class Solution {
public static void main(String[] args) {
Solution solution = new Solution();
int[] arr = {1,-2,3,10,-4,7,2,-5};
System.out.println(solution.FindGreatestSumOfSubArray2(arr));
}
/**
* 动态规划
* 如果 i - j 只和小于 i + 1 -- j 只和 i--;
* 如果 I - j 只和大于 i + 1 -- j 抛弃这个结果
* 动态转移方程:max = (dp[i - 1] + dp[i]), dp[i];
* @param array
* @return
*/
public int FindGreatestSumOfSubArray(int[] array) {
int n = array.length;
int[] dp = new int[n];
dp[0] = array[0];
int maxValue = array[0];
for (int i = 1; i < n; i++){
// 当前最大值
dp[i] = Math.max(dp[i - 1] + array[i] , array[i]);
// 结果最大值
maxValue = Math.max(dp[i], maxValue);
}
return maxValue;
}
/**
* 动态规划
* 使用滚动数组的思想
* @param array
* @return
*/
public int FindGreatestSumOfSubArray2(int[] array) {
int n = array.length;
int maxValue = array[0];
int x = maxValue;
for (int i = 1; i < n; i++){
x = Math.max(x + array[i] , array[i]);
maxValue = Math.max(x, maxValue);
}
return maxValue;
}
}