题目描述:输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。
思路分析:这个可以利用上一个的双指针的做法,但是不是连续的,所以需要从头和尾开始。看两个的和与S的大小,如果比S大,需要找一个小点的数,尾指针左移,如果比S小,需要找一个大点的数,头指针右移,直到相等为止。举例如下图:
代码如下:
import java.util.ArrayList; public class Solution { public ArrayList<Integer> FindNumbersWithSum(int [] array,int sum) { ArrayList<Integer> list = new ArrayList<Integer>(); if(array==null||array.length<2) { return list; } int plow = 0; int phigh = array.length-1; while(plow<phigh) { int n = array[plow]+array[phigh]; if(n==sum) { list.add(array[plow]); list.add(array[phigh]); return list; } else if(n<sum){ plow++; } else{ phigh--; } } return list; } }
反思:本题是递增序列可以利用双指针的做法,如果是递减序列也是同样的道理。看来这个双指针还是有很大好处的!