
import java.util.*;
//最大的leftMax与rightMax之差的绝对值
public class MaxSubtrct{
//方法一:暴力解法(通过k对数组进行划分)
public static int getMaxSub(int[]arr)
{
int N=arr.length;
int max1=Integer.MIN_VALUE;
int max2=Integer.MIN_VALUE;
int max=Integer.MIN_VALUE;
//获得第一部分的最大值
int k=0;
while(k<N-1)
{
for(int i=0;i<=k;i++)
{
max1=Math.max(arr[i],max1);
}
//获得第二部分的最大值
for(int i=k+1;i<N;i++)
{
max2=Math.max(arr[i],max2);
}
max=Math.max(max,Math.abs(max1-max2));
max1=Integer.MIN_VALUE;
max2=Integer.MIN_VALUE;
++k;
}
return max;
}
//方法二,排序法(时间复杂度和空间复杂度都高)
public static int getMaxSub2(int[]arr)
{
int N=arr.length;
int k=0;
int max=Integer.MIN_VALUE;
while(k<N-1)
{
int []max1=new int[k+1];
int []max2=new int[N-k-1];
//获得第一部分的最大值
for(int i=0;i<=k;i++)
{
max1[i]=arr[i];
}
Arrays.sort(max1);
//获得第二部分的最大值
for(int i=k+1;i<N;i++)
{
max2[i-(k+1)]=arr[i];
}
Arrays.sort(max2);
max=Math.max(max,Math.abs(max1[k]-max2[N-k-2]));
++k;
}
return max;
}
//方法三 最优解(时间复杂度为O(N),空间复杂度为O(1))
public static int getMaxSub3(int[]arr)
{
int N=arr.length;
int max=Integer.MIN_VALUE;
for(int i=0;i<N;i++)
{
max=Math.max(arr[i],max);
}
return max-Math.min(arr[0],arr[N-1]);
}
public static void main(String[]args)
{
//System.out.println("Hello");
int[]arr={2,7,3,1,1};
System.out.println(getMaxSub(arr));
System.out.println(getMaxSub2(arr));
System.out.println(getMaxSub3(arr));
}
}