狸猫的笔试——查找

来源:互联网 发布:爱普生t50清零软件 编辑:程序博客网 时间:2024/04/28 07:55

输入:

一个递增排序的数组

一个数字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 和 numif (num1 + num2 == s) {System.out.println(num1 + " " + num2);} else {System.out.println("Error" + num1 + " " + num2);}}




0 0
原创粉丝点击