第42题——和为S的两个数字

127 阅读1分钟

题目:

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

思路:

根据题目要求的特殊性,考虑快速排序的思想,i在数组最左端,j在数组最右端,i,j依次向中间靠拢。

Java

package nowcoder;

import java.util.ArrayList;

public class S42_FindNumbersWithSum {
    public ArrayList<Integer> FindNumbersWithSum(int[] array, int sum){
        ArrayList<Integer> list = new ArrayList<Integer>();
        if (array.length == 0 || array == null)
            return list;
        int i = 0;
        int j = array.length-1;
        while (i != j){
            if (array[i] + array[j] == sum){
                list.add(array[i]);
                list.add(array[j]);
                return list;
            }
            else if (array[i] + array[j] > sum)
                j--;
            else i++;
        }
        return list;
    }
    public static void main(String[] args){
        S42_FindNumbersWithSum s42 = new S42_FindNumbersWithSum();
        int[] array = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
        System.out.println(s42.FindNumbersWithSum(array, 11));
    }
}

Python

class FindNumbersWithSum:
    def FindNumbersWithSum(self, array, tsum):
        list = []
        if not array or len(array) == 0:
            return list
        i = 0
        j = len(array)-1
        while i < j:
            if array[i] + array[j] == tsum:
                list.append(array[i])
                list.append(array[j])
                return list
            elif array[i] + array[j] > tsum:
                j -= 1
            else: i += 1
        return list
if __name__ == '__main__':
    test = FindNumbersWithSum()
    array = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
    print(test.FindNumbersWithSum(array, 10))