剑指offer_1 和为 S 的两个数字

题目描述

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

方法一:暴力解决

import java.util.ArrayList;
public class Solution {
    public ArrayList<Integer> FindNumbersWithSum(int [] array,int sum) {
        ArrayList<Integer> list = new ArrayList<>();
        ArrayList<Integer> arr = new ArrayList<>();
        for(int i=0;i<array.length;i++)
            arr.add(array[i]);
        for(int i = 0;i < arr.size();i++){
            if(arr.get(i) > sum){
                return list;
            }
            if(arr.contains(sum-arr.get(i))){
                if(list.isEmpty())
                {
                    list.add(arr.get(i));
                    list.add(sum-arr.get(i));
                }
                else if(list.get(0)*list.get(1)>arr.get(i)*sum-arr.get(i)){
                    list.clear();
                    list.add(arr.get(i));
                    list.add(sum-arr.get(i));
                }
            }
        }
        return list;
    }
}

  

方法二:

解题思路

使用双指针,一个指针指向元素较小的值,一个指针指向元素较大的值,指向较小的指针从头遍历到尾,指向较大元素的指针从尾向头遍历

如果两个指针指向的元素的和sum==target,那么得到的要求的结果

如果sum>target,移动较大的元素使得sum变小一点

如果sum<target,移动较小的元素使得sum变大一点

 1 public ArrayList<Integer> FindNumbersWithSum(int[] array, int sum) {
 2 int i = 0, j = array.length - 1;
 3 while (i < j) {
 4   int cur = array[i] + array[j];
 5   if (cur == sum)
 6     return new ArrayList<>(Arrays.asList(array[i], array[j]));
 7   if (cur < sum)
 8     i++;
 9   else
10     j--;
11   }
12   return new ArrayList<>();
13 }

 

posted @ 2019-09-16 20:42  chyblogs  阅读(130)  评论(0)    收藏  举报