题目:在数组中,数字减去它右边的数字得到一个数对之差。求所有数对之差的最大值。例如在数组{2, 4, 1, 16, 7, 5, 11, 9}中,数对之差的最大值是11,是16减去5的结果。
参考:http://zhedahht.blog.163.com/blog/static/2541117420116135376632/
【分析】自顶向下分析,diff[i]记录0~i的最大数对之差,max[i]记录0~i的最大数,则状态递归方程为:
diff[i+1]=Math.max(max[i]-array[i+1],diff[i] )
自底向上分析, 初试max[1]=2,diff[1]=2-4=-2。max[2]=4,diff[2]=Max(4-1,diff[1])=3。max[3]=4,diff[3]=Max(4-16,diff[2])=3。……
算法复杂度为O(n)。
/**
* 创建时间:2014年9月5日 下午5:27:46
* 项目名称:Test
* @author Cao Yanfeng
* @since JDK 1.6.0_21
* 类说明: 动态规划解数组中的最大数对差
*/
public class MaxDiffofArray {
/**
* @paramargs
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
int[] array={1,15,2,5,0,-1};
System.out.println(getMaxDiff(array));
}
public static int getMaxDiff(int[] array) {
int length=array.length;
if (length==1) {
return-999;
}
if (length==2) {
return array[2]-array[1];
}
int max=array[0];
int maxDiff=max-array[1];
for (int i = 2; i < length; i++) {
if (array[1]>max) {
max=array[i-1];
}
int currentDif=max-array[i];
if (currentDif>maxDiff) {
maxDiff=currentDif;
}
}
return maxDiff;
}
}