剑指offer:和为S的两个数字

来源:互联网 发布:创作漫画的软件 编辑:程序博客网 时间:2024/06/09 14:08

题目描述

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

输出描述:

对应每个测试案例,输出两个数,小的先输出。

1.用两个ArrayList来实现

思路:用两个ArrayList,list1用来存放数组的积,list2用来存放最后的输出。如果list2发现有比存入的两个值积小的数,那么清空list2。再重新存。

import java.util.ArrayList;public class Solution {    public ArrayList<Integer> FindNumbersWithSum(int [] array,int sum) {         ArrayList<Integer> list1=new ArrayList<Integer>(); ArrayList<Integer> list2=new ArrayList<Integer>(); int sul=0; for(int i=0;i<array.length;i++){ for(int j=i+1;j<array.length;j++){ if(array[i]+array[j]==sum){if(list1.size()==0){list1.add(i*j);sul=array[i]*array[j];if(i<=j){list2.add(array[i]);list2.add(array[j]);}else{list2.add(array[j]);list2.add(array[i]);}}else if(sul>array[i]*array[j]){list1.remove(0);list1.add(i*j);if(i<=j){list2.clear();list2.add(array[i]);list2.add(array[j]);}else{list2.clear();list2.add(array[j]);list2.add(array[i]);}} } } } return list2;    }}

2.双指针思想

思想:数列满足递增,设两个头尾两个指针i和j,
若ai + aj == sum,就是答案(相差越远乘积越小)
若ai + aj > sum,aj肯定不是答案之一(前面已得出 i 前面的数已是不可能),end--
若ai + aj < sum,ai肯定不是答案之一(前面已得出 j 后面的数已是不可能),start++
O(n)

import java.util.*;public class Solution {    public ArrayList<Integer> FindNumbersWithSum(int [] array,int sum) {        ArrayList<Integer> listRes=new ArrayList<Integer>();        int n=array.length;        int start=0;        int end=n-1;        while(start<end){            //相差越远乘积越小            if(array[start]+array[end]==sum){                listRes.add(array[start]);            listRes.add(array[end]);                return listRes;            }else if(array[start]+array[end]<sum){                start++;            }else if(array[start]+array[end]>sum){                end--;            }        }        return listRes;    }}