题目描述

输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。

代码一

思想:双指针从两头遍历,其实最外层的乘积是最小的

  1. import java.util.ArrayList;
  2. public class Solution {
  3. public ArrayList<Integer> FindNumbersWithSum(int [] array,int sum) {
  4. ArrayList<Integer> result=new ArrayList<Integer>();
  5. //边界条件
  6. if(array==null||array.length<=1){
  7. return result;
  8. }
  9. int smallIndex=0;
  10. int bigIndex=array.length-1;
  11. while(smallIndex<bigIndex){
  12. //如果相等就放进去
  13. if((array[smallIndex]+array[bigIndex])==sum){
  14. result.add(array[smallIndex]);
  15. result.add(array[bigIndex]);
  16. //最外层的乘积最小,别被题目误导
  17. break;
  18. }else if((array[smallIndex]+array[bigIndex])<sum){
  19. smallIndex++;
  20. }else{
  21. bigIndex--;
  22. }
  23. }
  24. return result;
  25. }
  26. }

代码二

思想
使用函数,刷题不推荐这种方法

  1. public static ArrayList<Integer> FindNumbersWithSum(int [] array,int sum) {
  2. int temp = 0;
  3. int min = -1;
  4. ArrayList<Integer> arr = new ArrayList<Integer>();
  5. for(int i = 0;i<array.length/2;i++)
  6. {
  7. int find = Arrays.binarySearch(array,i+1,array.length,sum-array[i]);
  8. if(find>0) {
  9. temp = array[i]*array[find];
  10. if(min==-1) {
  11. min = temp;
  12. }
  13. if(temp<=min) {
  14. min = temp;
  15. arr.add(array[i]);
  16. arr.add(array[find]);
  17. }
  18. }
  19. }
  20. Collections.sort(arr);
  21. return arr;
  22. }