【剑指offer】和为S的两个数字

一世执手 提交于 2020-01-07 08:47:17

题目描述

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

解题思路

  1. 两个指针分别指向头和尾
  2. 如果当前和小于目标值,则头指针++;
  3. 如果当前和大于目标值,则尾指针–;
  4. 如果当前和等于目标值,则更新最小和,并把数字存入结果集合中。
  5. 清空ArrayList的方法是clear。
  6. 因为不知道最小和是正数还是负数,所以最小和的初始值只能设为最大的int。

代码

import java.util.ArrayList;
public class Solution {
    public ArrayList<Integer> FindNumbersWithSum(int [] array,int sum) {
        ArrayList<Integer> res = new ArrayList<Integer>();
        if(array == null || array.length == 0) return res;
        int low = 0, high = array.length - 1, product = 2147483647;
        while(low < high){
            if(array[low] + array[high] < sum){
                low++;
            } else if(array[low] + array[high] > sum){
                high--;
            } else {
                if(product > (array[low] * array[high])){
                    product = array[low] * array[high];
                    res.clear();
                    res.add(array[low]);
                    res.add(array[high]);
                }
                low++;
                high--;
            }
        }
        return res;
    }
}
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!