剑指 Offer 42. 连续子数组的最大和

image.png
剑指 Offer 42. 连续子数组的最大和 - 图2

图片转自 https://leetcode-cn.com/leetbook/read/illustration-of-algorithm/59h9mr

动态规划

  1. public class Solution {
  2. public int maxSubArray(int[] nums) {
  3. // 放置 nums[0] 至 nums[i] 的最大和,最终结果为 dp 数组的最大值
  4. int[] dp = new int[nums.length];
  5. // 初使化,dp 第一项为 nums 的第一项
  6. dp[0] = nums[0];
  7. // 从第二项开始遍历
  8. for (int i = 1; i < nums.length; i++) {
  9. // 如果前一位小于 0,说明是负贡献,不累加
  10. if (dp[i - 1] < 0) {
  11. dp[i] = nums[i];
  12. } else {
  13. // 否则累加
  14. dp[i] = nums[i] + dp[i - 1];
  15. }
  16. }
  17. Arrays.sort(dp);
  18. return dp[dp.length - 1];
  19. }
  20. }

动态规划,不使用额外空间

image.png

  1. public class Solution {
  2. public int maxSubArray(int[] nums) {
  3. // 优化点,不用额外空间,将 nums[0] 至 nums[i] 的最大和放在 nums[i]
  4. // 用于存放最大值 nums[0] 至 nums[i] 的最大值(累加之后)
  5. int res = nums[0];
  6. for (int i = 1; i < nums.length; i++) {
  7. // 累加,如果 nums[i - 1] 小于 0 则不累加
  8. nums[i] = nums[i] + Math.max(nums[i - 1], 0);
  9. // 刷新最大值
  10. res = Math.max(res, nums[i]);
  11. }
  12. return res;
  13. }
  14. }