題目描述:
輸入一個遞增排序的數組和一個數字S,在數組中查找兩個數,使得他們的和正好是S,如果有多對數字的和等於S,輸出兩個數的乘積最小的。
對應每個測試案例,輸出兩個數,小的先輸出。
思路:
- 用兩個指針,第一個指針start從左至右開始遍歷,第二個指針end從後至前開始遍歷
- 如果(start+end)<sum,則start++;
- 如果(start+end)>sum,則end--;
- 如果相等,那麼返回第一對等於sum的值。因爲兩個數的差值越大,乘積越小。
代碼:
package offer01;
import java.util.ArrayList;
public class TestNo42 {
public static void main(String[] args) {
int[] a = {1,2,3,4,5,6};
System.out.println(new TestNo42().FindNumbersWithSum(a,6));
}
public ArrayList<Integer> FindNumbersWithSum(int [] array,int sum) {
ArrayList<Integer> list = new ArrayList<>();
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;
} else if(array[i] + array[j] >sum){
j--;
}else{
i++;
}
}
return list;
}
}