53. Maximum Subarray
一、题目
1、审题
2、分析:
给出一个整形数组(可能全是负数),求连续的子数组的最大的和。
二、解答
1、思路:
方法一、动态规划
令 maxNum 代表最大和,tmpMaxNum 代表临时最大和。
当向后扫描时,对第 j 个元素有两种选择,要么放入前面的子数组,要么作为新数组的第一个元素;
如果 tmpMaxNum > 0, 则令 tmpMaxNum 加上 a[j]; 如果 tmpMaxNum < 0,则 tmpMaxNum = a[j];
每次扫描,比较 maxNum 与 tmpMaxNum 值, 若 tmpMaxNum > maxNum , 则 maxNum = tmpMaxNum。
public int maxSubArray(int[] nums) { int maxNum = nums[0]; int tmpMaxNum = nums[0]; for (int i = 1; i < nums.length; i++) { if(tmpMaxNum > 0) tmpMaxNum += nums[i]; else tmpMaxNum = nums[i]; if(tmpMaxNum > maxNum) maxNum = tmpMaxNum; } return maxNum; }
方法二、也是动态规划的思想,将问题化小,用 dp[i] 表示到下标 i 为止的最大和。故有: dp[i] = nums[i] + (dp[i - 1] > 0 ? dp[i -1] : 0);
public int maxSubArray2(int[] nums) { int n = nums.length; int[] dp = new int[n]; dp[0] = nums[0]; int max = dp[0]; for (int i = 1; i < n; i++) { dp[i] = nums[i] + (dp[i - 1] > 0 ? dp[i -1] : 0); max = Math.max(max, dp[i]); } return max; }