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

题意描述

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

输出描述

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

解题思路

一、思路一

因为数组是递增的,所以使用双指针,一个指向头部,一个指向尾部。

  1. array[start]+array[end] == sum,符合条件
  2. array[start]+array[end] > sum,end太大,end--
  3. array[start]+array[end] < sum,start太小,start++

第一组符合条件的start与end添加入list并返回(两数相差越大,乘积越小)

    public ArrayList<Integer> FindNumbersWithSum(int [] array,int sum) {
            ArrayList<Integer> list = new ArrayList<Integer>();
            if(array == null || array.length < 2) return list;
            int start = 0, end = array.length-1;
            while(start < end){
                if(array[start]+array[end] == sum){
                    list.add(array[start]);
                    list.add(array[end]);
                    return list;
                }else if(array[start]+array[end] > sum){
                    end --;
                }else{
                    start ++;
                }
            }
            return list;
	}
posted @ 2020-04-26 22:07  灵图  阅读(96)  评论(0)    收藏  举报