题目描述
给定一个数组arr,返回子数组的最大累加和
例如,arr = [1, -2, 3, 5, -2, 6, -1],所有子数组中,[3, 5, -2, 6]可以累加出最大的和12,所以返回12.
[要求]
时间复杂度为O(n)O(n),空间复杂度为O(1)O(1)
输入示例
[1, -2, 3, 5, -2, 6, -1]
输出示例
12
初始代码
import java.util.*;
public class Solution {
/**
* max sum of the subarray
* @param arr int整型一维数组 the array
* @return int整型
*/
public int maxsumofSubarray (int[] arr) {
// write code here
}
}
解题思路
这是我第一次没有做本地调试尝试一次就成功了。
这道题时一个很经典的一维动态规划问题,我们只遍历一遍数组元素,我们可以把每一次访问的元素看成是以该元素结尾的最大子数组和,我们设定一个初始的最大子数组和nowArrayRes 为0,访问的元素值加上最大子数组和nowArrayRes的值A如果比当前元素值大,则更新nowArrayRes值为A,如果A比nowArrayRes小,则nowArrayRes更新为当前元素值。
状态转移方程:
d
p
[
i
]
=
d
p
[
i
−
1
]
+
a
r
r
[
i
]
当
d
p
[
i
−
1
]
+
a
r
r
[
i
]
>
a
r
r
[
i
]
时
;
dp[i] = dp[i-1]+arr[i] 当dp[i-1]+arr[i] >arr[i]时;
dp[i]=dp[i−1]+arr[i]当dp[i−1]+arr[i]>arr[i]时;
d
p
[
i
]
=
a
r
r
[
i
]
当
d
p
[
i
−
1
]
+
a
r
r
[
i
]
<
=
a
r
r
[
i
]
时
;
dp[i] = arr[i] 当dp[i-1]+arr[i] <=arr[i]时;
dp[i]=arr[i]当dp[i−1]+arr[i]<=arr[i]时;
解题代码
import java.util.*;
public class Solution {
/**
* max sum of the subarray
* @param arr int整型一维数组 the array
* @return int整型
*/
public int maxsumofSubarray (int[] arr) {
// write code here
int nowArrayRes = 0;
for(int elem : arr){
if(elem+nowArrayRes > elem){
nowArrayRes = elem+nowArrayRes;
}else{
nowArrayRes = elem;
}
}
return nowArrayRes;
}
}
札记
动态规划一定需要额外的存储空间来记录每个子问题的结果。