动态规划-Maximum Subarray-Maximum Sum Circular Subarray
2020-02-18 20:57:58
一、Maximum Subarray
经典的动态规划问题。
问题描述:
问题求解:
public int maxSubArray(int[] nums) { int res = nums[0]; int n = nums.length; int[] dp = new int[n]; dp[0] = nums[0]; for (int i = 1; i < n; i++) { if (dp[i - 1] < 0) dp[i] = nums[i]; else dp[i] = dp[i - 1] + nums[i]; res = Math.max(res, dp[i]); } return res; }
二、Maximum Sum Circular Subarray
问题描述:
问题求解:
唯一的边界条件是如果全部为负数,那么minsubarray = sum,这个时候直接返回max即可。
public int maxSubarraySumCircular(int[] A) { int n = A.length; int sum = 0; for (int num : A) sum += num; int max = A[0]; int[] dp = new int[n]; dp[0] = A[0]; for (int i = 1; i < n; i++) { if (dp[i - 1] < 0) dp[i] = A[i]; else dp[i] = A[i] + dp[i - 1]; max = Math.max(max, dp[i]); } int min = A[0]; for (int i = 1; i < n; i++) { if (dp[i - 1] > 0) dp[i] = A[i]; else dp[i] = A[i] + dp[i - 1]; min = Math.min(min, dp[i]); } return max > 0 ? Math.max(max, sum - min) : max; }