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

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

思路1:从数组两端向中间查找满足条件的两个数

    开始还在纠结乘积最小,后来转念一想,a+b=sum,a和b越远乘积越小,而一头一尾两个指针往内靠近的方法找到的就是乘积最小的情况。

              如果是乘积最大的情况就是一直找到两个指针重合,每次找到一个就将之前返回的结果向量清空然后更新为新找到的。

       i和j表示数组两端下标
       当array[i]+array[j]>S时,j-- 尾端向前移动,两数据和增大
        当array[i]+array[j]=S时,将array[i],array[j]依次添加到ArrayList中,
       当array[i]+array[j]<S时,i++前段向后移动,两数据和减小
     

代码:

import java.util.ArrayList;
public class Solution {
    public ArrayList<Integer> FindNumbersWithSum(int [] array,int sum) {
        ArrayList<Integer> list = new ArrayList<Integer>();
        int left = 0;
        int right = array.length-1;
        while(left < right){
            int num = array[left] + array[right];
            if(num == sum){
                list.add(array[left]);
                list.add(array[right]);
                return list;
            }else if(num < sum){
                left++;
            }else{
                right--;
            }
        }
        return list;
    }
}

  运行时间:17ms

  占用内存:9288k

思路2:用HashMap存放元素和下标,然后开始遍历数组找到和为sum的两个元素,从左到右找到的第一对和为sum的就是最小的一对。

import java.util.ArrayList;
import java.util.HashMap;
public class Solution {
    public ArrayList<Integer> FindNumbersWithSum(int [] array,int sum) {
        HashMap map = new HashMap();
        ArrayList<Integer> result = new ArrayList();
        int len = array.length;
        for (int i = 0; i < len; i++) {
            map.put(array[i], i);
        }
        for (int i = 0; i < len; i++) {
            int sub = sum - array[i];
            if (map.containsKey(sub)) {
                result.add(array[i]);
                result.add(sub);
                break;
            }
        }
        return result;
    }
}

  运行时间:14ms

       占用 内存:9276k

  

猜你喜欢

转载自www.cnblogs.com/maohaitao/p/11281901.html