给定两个有序数组和一个指定的sum值,从两个数组中各找一个数使得这两个数的和与指定的sum值相差最小...

17 篇文章 0 订阅

 

题目:给定两个有序数组和一个指定的sum值,从两个数组中各找一个数使得这两个数的和与指定的sum值相差最小。

比如,有两个有序数组,数组1 为{ -5, -1, 0, 1, 4, 5, 7, 9 }数组2 为{ -3, 3, 10, 12, 15, 18, 21, 28 },如果 sum 为20,

则获得的结果为[-1 , 21],如sum为30,则与sum相差最小的两个数为[7 , 28] 。

解决该题目的方法可以采用如下的步骤:

1. 定义两个索引变量,  leftIndex为数组1的索引值,初始值为0,rightIndex为数组2的索引,初始值为数组2的长度减一。定义一个差值diff,初始值为 Integer.MAX_VALUE

2.  while (leftIndex < lenOne && rightIndex >= 0)  则执行相关的逻辑,此处分三种情况

  •      if (Math.abs(arrayOne[leftIndex] + arrayTwo[rightIndex]- expectedSum) < diff)  则更新diff和数组一和数组二中期望的两个数的值
  •      else if (arrayOne[leftIndex] + arrayTwo[rightIndex] < expectedSum)  则数组一的leftIndex++
  •      else 其它情况下,数组二的下标rightIndex–

3.  while循环结束,输出期望的值。

有了这个思想,我们可以编写如下的程序了。

public class FindClosestPairExample {
 
     public static void findAndPrintClosest( int [] arrayOne, int [] arrayTwo,
             int expectedSum) {
         int lenOne = arrayOne.length;
         int lenTwo = arrayTwo.length;
         int diff = Integer.MAX_VALUE;
         int resultOne = 0 ;
         int resultTwo = 0 ;
         int leftIndex = 0 ;
         int rightIndex = lenTwo - 1 ;
 
         while (leftIndex < lenOne && rightIndex >= 0 ) {
             if (Math.abs(arrayOne[leftIndex] + arrayTwo[rightIndex]
                     - expectedSum) < diff) {
                 resultOne = arrayOne[leftIndex];
                 resultTwo = arrayTwo[rightIndex];
                 diff = Math.abs(resultOne + resultTwo - expectedSum);
             } else if (arrayOne[leftIndex] + arrayTwo[rightIndex] < expectedSum) {
                 leftIndex++;
             } else {
                 rightIndex--;
             }
         }
 
         System.out.printf( "[%d , %d] \n" , resultOne, resultTwo);
     }
 
}

测试代码如下:

public static void main(String[] args) {
         int [] arrayOne = { - 5 , - 1 , 0 , 1 , 4 , 5 , 7 , 9 };
         int [] arrayTwo = { - 3 , 3 , 10 , 12 , 15 , 18 , 21 , 28 };
         System.out.println( "两个有序数组的内容为:" );
         System.out.println( "数组一:" + Arrays.toString(arrayOne));
         System.out.println( "数组二:" + Arrays.toString(arrayTwo));
 
         System.out.println( "与期望值20相差最小的两个数为:" );
         findAndPrintClosest(arrayOne, arrayTwo, 20 );
         System.out.println( "与期望值35相差最小的两个数为:" );
         findAndPrintClosest(arrayOne, arrayTwo, 35 );
 
     }

程序运行结果:

两个有序数组的内容为:
数组一:[-5, -1, 0, 1, 4, 5, 7, 9]
数组二:[-3, 3, 10, 12, 15, 18, 21, 28]
与期望值20相差最小的两个数为:
[-1 , 21] 
与期望值35相差最小的两个数为:
[7 , 28] 

原文地址http://thecodesample.com/?p=855

 

更多例子请访问 http://thecodesample.com/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值