题目描述
给定一个数组arr,返回子数组的最大累加和
例如,arr = [1, -2, 3, 5, -2, 6, -1],所有子数组中,[3, 5, -2, 6]可以累加出最大的和12,所以返回12.
[要求]
时间复杂度为O(n),空间复杂度为O(1)
public class Solution { /** * max sum of the subarray * @param arr int整型一维数组 the array * @return int整型 状态转移方程 dp[i] = dp[i-1] || sum+arr[i] */ public int maxsumofSubarray (int[] arr) { if(arr == null||arr.length==0) return 0; int[] dp = new int[arr.length]; int sum = 0; if(arr[0]>0){ dp[0] = arr[0]; sum = arr[0]; } for(int i =1;i<arr.length;i++){ sum += arr[i]; dp[i] = Math.max(dp[i-1],sum); sum = sum<0?0:sum; } return dp[arr.length-1]; } }
小结:
1、找最优子结构:dp[i-1]:表示到(i-1)个数的时候的最优解
2、找重叠子问题:当前最优解等于上一个最优解跟累积值+当前值的最大值,也就是说dp[i] = dp[i-1] || sum+arr[i],这里的sum指的是如果是正数则累加如果不是则为0
3、写出状态转移方程:dp[i] = dp[i-1] || sum+arr[i]
4、当然还要有初始值,这里默认第一个值是0或者第一个正数