输入:
一个递增排序的数组
一个数字S
要求:
在数组中查找两个数,使他们的和正好是S,如果有多对数字的和是S,则输出两个数乘积最小的
输出:
两个数
javaCode
最好情况下,时间复杂度为O(n/2)
public static void sum(int[] arr, int s) {
// 数组长度不够
if (arr.length <= 1) {
System.out.println("error");
return;
}
boolean mark = false;
// 让i、j指向数组的中间的两位
int i = arr.length / 2 - 1;
int j = i + 1;
// 将两个数初始化为arr的最大值
int num1 = arr[arr.length - 1] + 1;
int num2 = arr[arr.length - 1] + 1;
// 如果越界,或者i,j重合则结束
while (i >= 0 && j < arr.length && (i != j)) {
if (i == 0 && j == arr.length - 1)
mark = true;
// ==s时,i,j都往边缘走
if (arr[i] + arr[j] == s) {
if (arr[i] * arr[j] < num1 * num2) {
num1 = arr[i];
num2 = arr[j];
}
if (j == arr.length - 1 && i == j - 1)
break;
if (mark)
++i;
else
--i;
} else if (arr[i] + arr[j] > s) {
// 如果大于s,则i应减小
// 如果i移到边缘,则j应减小
if (i == 0)
--j;
else if (mark)
--j;
else
--i;
} else {
// 如果小于s 则j应增大
// 如果j移动到边缘,则i应增大
if (j >= arr.length - 1)
++i;
else if (mark)
++i;
else
++j;
}
}
// 如果num1 和 num
if (num1 + num2 == s) {
System.out.println(num1 + " " + num2);
} else {
System.out.println("Error" + num1 + " " + num2);
}
}