题意
给定一个数组 求出数组的最大子数组和 其中包含正,负 和0;
第一种方法:暴力求解法
很简单把每个子数组的和求出来话不多说看代码。
/**
* 方法1暴力求解法 把所有的子数组都求解出来O(n2)
*/
public static int getMaxSubArr(int[] arr){
if (arr.length==0 || arr==null) return 0;
int res=Integer.MIN_VALUE;
for (int i = 0; i < arr.length; i++) {
int sum=0;
for (int j = i; j < arr.length; j++) {
sum+=arr[j];
if (sum>res){
res=sum;
}
}
}
return res;
}
第二种方法:DP求解
很简单理解加上当前的数arr[i]和DP[i-1]哪个值大例如:
int[] arr=new int[]{-2,11,-4,13,-5,-2};
dp[0]=-2; dp[1]=-2+11和11哪个大取哪个结果就出来了。
/**
*dp求解子数组的最大和
* @param arr
* @return
*/
public static int getNum(int[] arr){
int[] dp=new int[arr.length];
dp[0]=arr[0];
int sum=Integer.MIN_VALUE;
for (int i = 1; i < arr.length; i++) {
dp[i]=Math.max(dp[i-1]+arr[i],arr[i]);
sum=Math.max(sum, dp[i]);
}
return sum;
}