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


图片转自 https://leetcode-cn.com/leetbook/read/illustration-of-algorithm/59h9mr
动态规划
public class Solution {public int maxSubArray(int[] nums) {// 放置 nums[0] 至 nums[i] 的最大和,最终结果为 dp 数组的最大值int[] dp = new int[nums.length];// 初使化,dp 第一项为 nums 的第一项dp[0] = nums[0];// 从第二项开始遍历for (int i = 1; i < nums.length; i++) {// 如果前一位小于 0,说明是负贡献,不累加if (dp[i - 1] < 0) {dp[i] = nums[i];} else {// 否则累加dp[i] = nums[i] + dp[i - 1];}}Arrays.sort(dp);return dp[dp.length - 1];}}
动态规划,不使用额外空间

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