public static int maxSubArray(int[] nums) {
if (nums == null || nums.length == 0)
return 0;
int curr = 0;
int sum = Integer.MIN_VALUE;
for (int i = 0; i < nums.length; i++) {
curr += nums[i];
if (sum < curr)
sum = curr;
if (curr < 0)
curr = 0;
}
return sum;
}
//更标准的动态规划写法
public int maxSubArray_2(int[] A) {
if(A==null || A.length==0)
return 0;
int global = A[0];
int local = A[0];
for(int i=1;i<A.length;i++)
{
local = Math.max(A[i],local+A[i]);
global = Math.max(local,global);
}
return global;
}
变式:求最大连续子数组乘积
思路:
维护三个变量,分别记录i-1结尾的最大累乘积、i-1结尾的最小累乘积、全局最大值;我们考虑以i结尾的子数组的最大乘积,有以下三种情况:
a. i上的乘积就是i-1位置的最大乘积*arr【i】 比如 100 10 2
b. i上的乘积就是i-1位置的最小乘积*arr【i】 比如 100 -10 -2
c. 自己构成的子数组最大(前面是<1的情况)比如 0.1 0.1 100
public int maxProduct(int[] nums) {
if(nums==null||nums.length==0)
return 0;
int subMax[]=new int[nums.length];
int subMin[]=new int[nums.length];
subMax[0]=nums[0];
subMin[0]=nums[0];
int res=nums[0];
for(int i=1;i<nums.length;i++){
subMax[i]=Math.max(Math.max(nums[i],subMax[i-1]*nums[i]),subMin[i-1]*nums[i]);
subMin[i]=Math.min(Math.min(nums[i],subMax[i-1]*nums[i]),subMin[i-1]*nums[i]);
res=Math.max(res,subMax[i]);
}
return res;
}