描述
给定一个数组arr,返回子数组的最大累加和
例如,arr = [1, -2, 3, 5, -2, 6, -1],所有子数组中,[3, 5, -2, 6]可以累加出最大的和12,所以返回12.
题目保证没有全为负数的数据
[要求]
时间复杂度为
O
(
n
)
O(n)
O(n),空间复杂度为
O
(
1
)
O(1)
O(1)
示例1
输入:[1, -2, 3, 5, -2, 6, -1]
返回值:12
解体思路
思路一
贪心算法,代码如下:
public int findKth(int[] a, int n, int K) {
int curMax = 0;
int curTotalValue = 0;
for (int i = 0; i < arr.length; i++) {
if ((arr[i] + curTotalValue) < 0) {
curTotalValue = 0;
continue;
}
curTotalValue += arr[i];
if (curTotalValue > curMax) {
curMax = curTotalValue;
}
}
return curMax;
复杂度分析:
时间复杂度:
O
(
N
)
O(N)
O(N),遍历一遍数据。
空间复杂度:
O
(
1
)
O(1)
O(1),无需额外空间。
思路二
动态规划,代码如下:
public int maxsumofSubarray(int[] arr) {
int ans = arr[0];
int cur_max = arr[0];
for (int i = 1; i < arr.length; i++) {
cur_max = Math.max(cur_max + arr[i], arr[i]); // 更新当前累积和
ans = Math.max(cur_max, ans); // 更新最大累积和
}
return ans;
}
复杂度分析:
时间复杂度:
O
(
N
)
O(N)
O(N),遍历一次数组。
空间复杂度:
O
(
1
)
O(1)
O(1),无需额外空间。