题目地址:
题目大意是给定一个int数组,求和最大的非空子串的那个和是多少。 用一个一维数组 dp [ i ] 表示以下标 i 结尾的子数组的元素的最大的和,也就是这个子数组最后一个元素是下边为 i 的元素,并且这个子数组是所有以 i 结尾的子数组中,和最大的。
这样的话就有两种情况,
- 如果 dp [ i - 1 ] < 0,那么 dp [ i ] = nums [ i ]。
- 如果 dp [ i - 1 ] >= 0,那么 dp [ i ] = dp [ i - 1 ] + nums [ i ]。
class Solution {
public int maxSubArray(int[] nums) {
int n = nums.length;
int[] dp = new int[n];
int max = nums[0];
dp[0] = nums[0];
for (int i = 1; i < n; i++) {
//两种情况更新 dp[i]
if (dp[i - 1] < 0) {
dp[i] = nums[i];
} else {
dp[i] = dp[i - 1] + nums[i];
}
//更新 max
max = Math.max(max, dp[i]);
}
return max;
}
}
时间复杂度: O(n)。
空间复杂度:O(n)。
相关链接: 1.53. Maximum Subarray · leetcode