public class SubarrayMax {
public static void main(String[] args)
{
int[] a = {8,-1,-1,5,3,2,8,-9};
System.out.println(method1(a,a.length));
System.out.println(method2(a,a.length));
System.out.println(method3(a,a.length));
System.out.println(method4(a,0,a.length-1));
}
//分治思想
public static int method4(int a[],int left,int right){
if(left==right){
return max(a[left],0);
}
int middle=(left+right)/2;
//求(A[0],...A[n/2-1])中子数组包含A[n/2-1]的最大值
int lmaximum=0;
int lsum=0;
for(int i=middle;i>=left;i--){
lsum+=a[i];
if(lsum>lmaximum)
lmaximum=lsum;
}
//求(A[n/2],...,A[n-1])中子数组包含A[n/2]的最大值
int rmaximum=0;
int rsum=0;
for(int i=middle+1;i<=right;i++){
rsum+=a[i];
if(rsum>rmaximum)
rmaximum=rsum;
}
return max(lmaximum+rmaximum,max(method4(a,left,middle),method4(a,middle+1,right)));
}
public static int method3(int[] a,int n)
{
int nstart = a[n-1];
int nall = a[n-1];
for(int i=n-2;i>=0;i--)
{
if(nstart<0)
nstart = 0;
nstart +=a[i];
if(nstart>nall)
nall = nstart;
}
return nall;
}
//start 包含a[i]的最大值
//all 最大值
public static int method1(int a[],int n)
{
int[] start = new int[n];
int[] all = new int[n];
start[n-1] = a[n-1];
all[n-1] = a[n-1];
for(int i=n-2;i>=0;i--)
{
start[i] = max(a[i],a[i]+start[i+1]);
all[i] = max(start[i],all[i+1]);
}
return all[0];
}
//节省空间
public static int method2(int[] a,int n)
{
int nstart = a[n-1];
int nall = a[n-1];
for(int i=n-2;i>=0;i--)
{
nstart = max(a[i],nstart+a[i]);
nall = max(nstart,nall);
}
return nall;
}
private static int max(int i, int j) {
return i>j?i:j;
}
}
子数组的最大和
最新推荐文章于 2023-12-01 18:45:00 发布