求数对的最大值

package maxD_value;
/**
 * 题目:在数组中,数字减去它右边的数字得到一个数对之差。
 * 求所有数对之差的最大值。例如在数组{2, 4, 1, 16, 7, 5, 11, 9}中,数对之差的最大值是11,是16减去5的结果。
 *
 */
public class Test {


//下面这个方法是从后往前遍历一遍,找出最小的值,然后用前面的值减去最小的值,并找出遍历中的最大数,则得到了结果。
public static int maxValue_MethodOne(int array[])
{
int max=0,D_value;
int n = array.length;
int min = array[n-1];
for(int i=n-2;i>=0;i--)
{
D_value = array[i] - min;

if(D_value > max ) // 如果当前的差值比以前的值都大,则更新结果。
max = D_value;
if(D_value<0)
min = array[i]; //如果一个D_value<0 则说明当前的array[i]比min还小,则更改min的值
}
return max;
}
//下面的这种方法和上面的思想是一样的
public static int maxValue_MethodTwo(int array[])
{
int D_value,result=0;
int n = array.length;
int max = array[0];
for(int i=1;i<n;i++)
{
D_value = max - array[i];
if(array[i]>max)
max = array[i];
if(D_value>result)
result = D_value;
}
return result;
}
//下面的方法就是将其转化为求数组的最大子段和问题
/**
* 思想为下面:
* 如果输入一个长度为n的数组numbers,我们先构建一个长度为n-1的辅助数组diff,
* 并且diff[i]等于numbers[i]-numbers[i+1](0<=i<n-1)。
* 如果我们从数组diff中的第i个数字一直累加到第j个数字(j > i),
* 也就是diff[i] + diff[i+1] + … + diff[j] 
* = (numbers[i]-numbers[i+1]) + (numbers[i + 1]-numbers[i+2])
*  + ... + (numbers[j] – numbers[j + 1]) = numbers[i] – numbers[j + 1]。
*
*分析到这里,我们发现原始数组中最大的数对之差(即numbers[i] – numbers[j + 1])其实是辅助数组diff中最大的连续子数组之和。
*
*
*/
public static int maxValue_MethodThree(int array[])
{

//新建一个数组,用于存放原来数组中相邻两个数据的差值
int n = array.length;
int tem[] = new int[n-1];
for(int i=1;i<n;i++)
{
tem[i-1] = array[i-1]-array[i];
}
// 下面就转化为求tem数组中连续字段和最大的问题了,
int max = 0;
int sum=0;
for(int i=0;i<tem.length;i++)
{
sum += tem[i];
if(sum>max)
max = sum;
if(sum<0)
{
sum =0;
}
}
return max;
}
public static void main(String[] args) {
int arr[] = new int[]{2, 4, 1, 16, 7, 5, 11, 9};
System.out.println("求解数组中的差值最大问题\n");

int max  = maxValue_MethodOne(arr);
System.out.println("使用第一种方法求解的结果为 :"+max);
max = maxValue_MethodTwo(arr);
System.out.println("使用 第二种方法求解的结果为:"+max);
max = maxValue_MethodThree(arr);
System.out.println("使用第三种方法求解的结果为:"+max);
}

}


运行的结果为:

求解数组中的差值最大问题


使用第一种方法求解的结果为 :11
使用 第二种方法求解的结果为:11
使用第三种方法求解的结果为:11

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值