求解数组中两数之差的最大值
运行结果如下:
如:array={1,4,17,3,2,9} 最大值为:17-2=15
package datastruct.usearray;
public class GetMaxOfTwoDiffer {
//蛮力算法:时间复杂度为:o(n^2)
private static void method(int array[]) {
int n=array.length;
int max=Integer.MIN_VALUE;
for (int i = 0; i <n-1; i++) {
for (int j = i+1; j < array.length; j++) {
if (max<array[i]-array[j]) {
max=array[i]-array[j];
}
}
}
System.out.println("蛮力算法:两数最大的差值为:"+max);
}
//利用动态规划:时间复杂度和空间复杂度均为:o(n)
/**
* 思路如下:
* 1.申请两个额外空间,diff[] 和 max[]
* diff[i]表示:以数组array的第i个元素作为减数的所有数对之差的最大值
* max[i]表示:前i+1个最大数,因为数组是从0开始,所以是前i+1个
* 2.由以上可知:求diff[i]的值分为两种情况:
* 第一种是:diff[i-1]
* 第二种是:max[i-1]-array[i]
* 所以:diff[i]=max{diff[i-1],max[i-1]-array[i]}
* max[i]=max{max[i-1],array[i]}
*/
private static int max(int a,int b) {
return a>b?a:b;
}
private static void method2(int array[]) {
if (array==null) {
System.out.println("不存在!");
return ;
}
if (array.length<=1) {
System.out.println("不存在!");
return;
}
int n=array.length;
int diff[]=new int[n];
int max[]=new int[n];
//初始化
diff[0]=Integer.MIN_VALUE;
max[0]=array[0];
for (int i = 1; i < n; i++) {
diff[i]=max(diff[i-1],max[i-1]-array[i]);
max[i]=max(max[i-1], array[i]);
}
System.out.println("动态规划:两数最大的差值为:"+diff[n-1]);
}
//对动态规划的方法进行优化,进一步降低空间复杂度
/**
* 由上述动态规划方法可知:我们只是用到了diff[i]和max[i],与其他无关
* 也就是说,我们可以用两个变量 diff max
* diff替换掉diff[]
* max替换掉max[]
*/
private static void method3(int array[]) {
int n=array.length;
if (array==null) {
System.out.println("不存在!");
return;
}
if (n<=1) {
System.out.println("不存在!");
return;
}
int max=array[0];
int diff=Integer.MIN_VALUE;
for (int i = 1; i < n; i++) {
diff=max(diff, max-array[i]);
max=max(max, array[i]);
}
System.out.println("优化后动态规划:两数最大的差值为:"+diff);
}
public static void main(String[] args) {
int [] array={1,4,17,3,2,9};
method(array);
method2(array);
method3(array);
}
运行结果如下: