Problem: 53. 最大子数组和
思路
这个问题可以使用动态规划来解决。我们可以定义一个状态dp[i],表示以第i个元素为结尾的最大子数组和。然后我们可以通过比较当前元素和当前元素加上前一个元素的和,来更新dp[i]。最后,我们只需要找出dp数组中的最大值,就是我们要找的最大子数组和。
解题方法
我们首先初始化dp[0]为nums[0],然后从第二个元素开始,通过比较当前元素和当前元素加上前一个元素的和,来更新dp[i]。最后,我们只需要找出dp数组中的最大值,就是我们要找的最大子数组和。
复杂度
时间复杂度:
O ( n ) O(n) O(n),我们只需要遍历一次数组。
空间复杂度:
O ( n ) O(n) O(n),我们需要一个长度为n的数组来存储dp状态。
Code
class Solution {
public int maxSubArray1(int[] nums) {
int n = nums.length;
int[] dp = new int[n];
dp[0] = nums[0];
int ans = nums[0];
for (int i = 1; i < n; i++) {
dp[i] = Math.max(nums[i], dp[i - 1] + nums[i]);
ans = Math.max(ans, dp[i]);
}
return ans;
}
// 空间压缩
public int maxSubArray(int[] nums) {
int n = nums.length;
int pre = nums[0];
int ans = nums[0];
for (int i = 1; i < n; i++) {
pre = Math.max(nums[i], pre + nums[i]);
ans = Math.max(ans, pre);
}
return ans;
}
}