题目描述
输入一个长度为n的整型数组array,数组中的一个或连续多个整数组成一个子数组,子数组最小长度为1。求所有子数组的和的最大值。
数据范围:
1<=n<=2×105
−100<=a[i]<=100
要求:时间复杂度为 O(n),空间复杂度为 O(n)
进阶:时间复杂度为 O(n),空间复杂度为 O(1)
示例1
输入:
[1,-2,3,10,-4,7,2,-5]
输出:
18
示例2
输入:
[2]
输出:
2
示例3
输入:
[-10]
输出:
-10
题解:
使用动态规划,那就先说一下动态规划的主要思想:
动态规划主要就是利用曾经计算过的,来计算新的,一般是用一维数组或二维数组保存历史记录。主要是找出来一个等式,而这个等式取决于你定义的dp数组的意义。
就此题来说:
定义一个 dp[ ] 一维数组,我们将 dp[ i ] 定义为长度为 i 的数组连续子数组最大和。我们要找 dp [ i ] 的值 相当于就是找 arr[ i ] 这个数组连续子数组最大和,他的子数组最大和就是 dp[ i -1 ] 加上 arr [ i ] 和 arr[ i ] 本身求最大值。因为dp[ i - 1] 已经是arr[i-1]的最大和了,那 arr[ i ] 拆开不就是 arr[i-1] 和arr[i]吗,arr[ i-1] 的最大值 dp[ i-1 ] 理论上我们已经获得了,arr[i] 的子数组最大和要么是 dp[i-1],要么就是后面这个 arr[i] ,那就等式找到了:
dp[ i ] = max(dp[ i - 1] + arr[ i ] , arr[ i ])
找到等式就简单了,看代码:
public class Solution {
public static void main(String[] args) {
Solution s = new Solution();
int [] arr = {1,-2,3,10,-4,7,2,-5};
System.out.println(s.FindGreatestSumOfSubArray(arr));
}
public int FindGreatestSumOfSubArray(int[] array) {
int n = array.length;
int dp[] = new int[n];
int max = array[0];
dp[0] = array[0];
for (int i=1;i<n;i++){
dp[i] = Math.max(dp[i-1]+array[i],array[i]);
max = Math.max(max,dp[i]);
}
return max;
}
}