题目一:
输入一个整形数组,数组里有正数也有负数。
数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
求所有子数组的和的最大值
思路:
创建一个新数组B用于存放数组i之前的最大子数组的和,从前往后遍历原数组A,计算数组A当前i元素的值+B数组的i-1元素的值的和 与数组A当前元素的值比较大小,选择大的存放在数组B中。最后数组B中最大的元素就是连续子数组的最大和
题目二
输入一个整数数组,任意连续的两个或多个整数为一个子数组,求子数组的最大和。
思路:
这道题和上道题的不同在于这道题规定了子数组的最小长度为2。我们可以先创建一个数组长为2,去算每一个长度为2的子数组的和,取最大值,原数组遍历结束后,再将子数组的长度设为3,重复上面操作,直到子数组的长度为原数组长度,从上述其中记录和最大值就可
代码:
package dp;
import java.util.Arrays;
public class MaxSum {
public static void main(String[] args) {
int[] arr=new int[]{-1,-1,10,-9};
int res=find1(arr);
System.out.println(res);//10
int r=find2(arr);
System.out.println(r);//9
}
/*
输入一个整形数组,数组里有正数也有负数。
数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
求所有子数组的和的最大值
* */
private static int find1(int[] arr) {
int[] dp=new int[arr.length];
dp[0]=arr[0];
int max=dp[0];
for (int i = 1; i <arr.length ; i++) {
dp[i]=Math.max(dp[i-1]+arr[i],arr[i]);
max=Math.max(max,dp[i]);
}
return max;
}
/*输入一个整数数组,任意连续的两个或多个整数为一个子数组,求子数组的最大和。*/
private static int find2(int[] arr) {
int maxsum=0;
int n=arr.length;
int sum=0;
for(int a=2;a<=n;a++){//用来控制数组的整体大小
//创建一个子数组,子数组的长度从2,依次递增到n
int[] zi=new int[a];
for(int b=n-a+1 ;b>0; b--){//用来配合移动arr下标
for (int i = 0; i <a ; i++) {//给子数组赋值
zi[i]=arr[i+n-a+1-b];
sum+=zi[i];//算子数组的和
}
if (sum>maxsum){
maxsum=sum;
}
sum=0;//将sum置为0,用于下一轮计算
}
}
return maxsum;
}
}