package su.interview;
/**
* 题目:在数组中,数字减去它右边的数字得到一个数对之差。求所有数对之差的最大值。 例如在数组{2, 4, 1, 16, 7, 5, 11,
* 9}中,数对之差的最大值是11,是16减去5的结果。
*
* @author Toy
*
*/
public class PairNum {
/**
* 集腋成裘 O(n^2)
* @param a
* @return
*/
public int pair_num_01(int[] a) {
int n = a.length;
int maxPair = 0;
for (int i = 0; i < n; i++) {
for (int j = i + 1; j < n; j++) {
if ((a[i] - a[j]) > maxPair) {
System.out.println("Stroe: " + a[i] + " " + a[j]);
maxPair = a[i] - a[j];
}
}
}
return maxPair;
}
/**
* O(n)
* @param a
* @return
*/
public int pair_num_02(int[] a){
int n = a.length;
int maxPair = 0;
int[] b=new int[n-1];
for(int i=0;i<n-1;i++){
b[i]=a[i]-a[i+1];
}
//最大子段和
int[] c=new int[n-1];
c[0]=b[0];
for(int i=1;i<n-1;i++){
if(c[i-1]>0){
c[i]=c[i-1]+b[i];
}else{
c[i]=b[i];
}
if(c[i]>maxPair){
maxPair=c[i];
}
}
return maxPair;
}
/**
* O(n) 对方法2的空间优化
* @param a
* @return
*/
public int pair_num_03(int[] a){
int n = a.length;
int maxPair = 0;
int[] b=new int[n-1];
for(int i=0;i<n-1;i++){
b[i]=a[i]-a[i+1];
}
//最大子段和 -- 空间优化了
for(int i=1;i<n-1;i++){
if(b[i-1]>0){
b[i]=b[i-1]+b[i];
}else{
b[i]=b[i];
}
if(b[i]>maxPair){
maxPair=b[i];
}
}
return maxPair;
}
/**
* @param args
*/
public static void main(String[] args) {
int[] a = new int[] { 2, 4, 1, 16, 7, 5, 11, 9 };
int max = 0;
PairNum p = new PairNum();
max = p.pair_num_01(a);
System.out.println(max);
max = p.pair_num_02(a);
System.out.println(max);
max = p.pair_num_03(a);
System.out.println(max);
}
}