输入一个递增排序的数组和数字s在数组中查找两个数,使得他们的和恰好为s。如果有多对数字的和等于s,输出两个数的乘积最小的
分析
定义一个数组a,按递增排好序,给定一个值num = 4,求数组a里两数之和等于num
这是一个递增排序的数组,要求其中两数的和等于给定的值,如果a[l] + a[r] > num,说明大了,r左移,l不动
发现还是大了,r继续左移,直到
在l = 0,r = 3处时满足a[l] + a[r] = num,找到目标值。那么是不是积最小的呢?
两数差越大,积越小
首先,一个逐渐递增的数组从两边向中间遍历,指针对应的数的差是不断变小的,积是不断变大的。比如在 1 2 2 3 5中,求等于4的两个数且他们积最小的值。当遍历到1和3时就满足了条件,这两个数差最大,就可以跳出循环,根本不会遍历到 2 2.
实现
package OJ;
import java.util.Scanner;
/**
* @author Chris
*/
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int[] a = new int[in.nextInt()];
int num = in.nextInt();
int left = 0;
int right = a.length - 1;
for (int i = 0; i < a.length; i++) {
a[i] = in.nextInt();
}
while (left < right){
if(a[left] + a[right] < num){
left++;
}else if(a[left] + a[right] > num){
right--;
}else{
break;
}
}
System.out.println(a[left]+" "+right);
}
}
输出: