《剑指offer》------和为S的数字

Posted 走在修行的大街上

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了《剑指offer》------和为S的数字相关的知识,希望对你有一定的参考价值。

题目:

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

思路:

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

解答:

import java.util.ArrayList;
public class 和为S的数字 {
    public static ArrayList<Integer> FindNumbersWithSum(int [] array,int sum) {
        ArrayList<Integer> list = new ArrayList<Integer>();
        if(array==null||array.length<2){
            return list;
        }
        int i = 0,j = array.length-1;
        while(i<j){
            if(array[i]+array[j]==sum){
                list.add(array[i]);
                list.add(array[j]);
                //return list;         //如果只输出乘积最小的,就在这里return list;即可
                i++;
                j++;
            }else if(array[i]+array[j]>sum){
                j--;
            }else{
                i++;
            }
        }
        return list;
    }
    public static void main(String[] args) {
        int array[] = {1,2,3,4,5,6,7,8,9,10};
        int sum = 10;
        ArrayList<Integer> list = FindNumbersWithSum(array,sum);
        System.out.println(list);
    }
}

测试结果:

[1, 9, 2, 8, 3, 7, 4, 6]

以上是关于《剑指offer》------和为S的数字的主要内容,如果未能解决你的问题,请参考以下文章

剑指offer-和为s的俩个数字

[剑指Offer]57-和为s的数字

[剑指offer]面试题41:和为s的两个数字VS和为s的连续正数序列

[剑指Offer]41 和为S的两个数字 VS 和为S的连续正数序列

剑指offer 和为s的两个数字

剑指OFFER----面试题57. 和为s的两个数字