public int maxSubArray(int[] nums) {
// 解法一:暴力求解,n^2
int sum = Integer.MIN_VALUE;
for (int i=0; i<nums.length; i++) {
int t = 0;
for (int j=i; j<nums.length; j++) {
t += nums[j];
sum = Math.max(sum, t);
}
}
return sum;
}
1.2 解法二:动态规划
最大子序列等于,当前最大,或包含之前都最大
public int maxSubArray(int[] nums) {
// 解法二:动态规划
int[] dp = new int[nums.length];
dp[0] = nums[0];
int max = dp[0];
for (int i=1; i<nums.length; i++) {
dp[i] = Math.max(nums[i], nums[i] + dp[i-1]);
max = Math.max(dp[i], max);
}
return max;
}
1.3 解法三:分治
public int maxSubArray(int[] nums) {
// 解法三: 分治
return solve3(0, nums.length-1, nums);
}
// 解法三:分治
private int solve3(int lo, int hi, int[] nums) {
// 递归终止条件
if (lo==hi) return nums[lo];
int mid = (hi + lo)/2;
// 分成子问题
int leftRes = solve3(lo, mid, nums);
int rightRes = solve3(mid+1, hi, nums);
// 处理当前层, 计算中间的值
int t1 = 0;
int max1 = nums[mid];
for (int i=mid; i>=lo; i--) {
t1 += nums[i];
max1 = Math.max(t1, max1);
}
int t2 = 0;
int max2=nums[mid+1];
for (int i=mid+1; i<=hi; i++) {
t2 += nums[i];
max2 = Math.max(t2, max2);
}
return Math.max(Math.max(leftRes, rightRes), max1+max2);
}