数对之差的最大值

数组中某数字减去其右边的某数字得到一个数对之差,求所有数对之差的最大值,注意,算法的时间复杂度必须小于O(N 2 )。
提示:是可以做到O(NlogN)的

例如:
数组{ 2,4,1,17,7,5,11,9,3,9,1,18,4,4 }中,数对之差的最大值是16(17-1)

可能我们会想这个问题很简单嘛,就是轮询去找最大值和最小值,然后相减不就是数对之差最大值了吗!其实完全不是,你怎么能确定最大值就在最小值的左边,这个题难就难在是数组中某个数字减去其右边的某数字的差的最大值。

当然,你可以轮询去让每个数字去减其右边的数字,然后得出最大值,ok,这个思路是正确的,但它的时间复杂度是O(N 2 ),不满足要求。

正确解题方法:
其实提示信息就告诉我们答案了,一看到log就要想到2,2就是平分再平分,就像切西瓜,不停的切,就会得到logN的时间复杂度。Ok,那我们试着把数组分成两部分,看看有什么思路。

  • 最大值和最小值都在第一部分
  • 最大值和最小值都在第一部分
  • 最大值在第一部分,最小值在第二部分

反正就这三种情况,我们用以下代码实现

public int maxValue(int start, int end){
    if(end - start <= 1){
        return values[start] - values[end];
    }
    int mid = (start + end)/2;
    int min = values[end];
    int max = values[start];
    for(int i=start; i<=mid; i++){
        if(max < values[i]){
            max = values[i];
        }
    }
    for(int i=mid+1; i<=end; i++){
        if(min > values[i]){
            min = values[i];
        }
    }
    int result0 = max - min;
    int result1 = maxValue(start, mid);
    int result2 = maxValue(mid+1, end);
    return Math.max(result2, Math.max(result0, result1));

}
static int[] values = {2,4,1,17,7,5,11,9,3,9,1,18,4,4};
int result = maxValue(0, values.length-1);
System.out.println("result = " + result);

程序运行结果如下:

result = 16

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值