题目抽象:给定一个数组,返回两个数字和为sum且乘积最小的两个数字。
和为S的两个数字
http://www.nowcoder.com/questionTerminal/390da4f7a00f44bea7c2f3d19491311b
import java.util.ArrayList;
/*
考察知识点:数学,双指针
思路:因为数组是有序的,所以可以用双指针,指向数组的首尾,具体步骤如下:
1.初始化:指针i指向数组首, 指针j指向数组尾部
2. 如果arr[i] + arr[j] == sum , 说明是可能解
3. 否则如果arr[i] + arr[j] > sum, 说明和太大,所以--j
4. 否则如果arr[i] + arr[j] < sum, 说明和太小,所以++i
*/
//数学方法
public class Solution {
//数学方法 public ArrayList<Integer> FindNumbersWithSum(int [] array,int sum) { ArrayList<Integer> list=new ArrayList<>(); if(array.length==0||array==null) return list; int min=0; for(int i=0;i<array.length;i++){ if(array[i]>sum/2) break; for(int j=i+1;j<array.length;j++){ int sum1=array[i]+array[j]; if(sum1==sum) { int val=array[i]*array[j]; if(min==0||min>val) { min=val; list=new ArrayList<>(); list.add(array[i]); list.add(array[j]); } } if(sum1>sum) break; } } return list; } //双指针方法:一个指针指向头部,一个指针指向尾部 public ArrayList<Integer> FindNumbersWithSum(int [] array,int sum) { ArrayList<Integer> list=new ArrayList<>(); if(array.length==0||array==null) return list; int left=0; int right=array.length-1; int min=0; while(left<right && array[left]<=sum/2){ int sum1=array[left]+array[right]; if(sum1==sum){ int val=array[left]*array[right]; if(min==0||min>val){ min=val; list=new ArrayList<>(); list.add(array[left]); list.add(array[right]); } left++;right--; } else if(sum1>sum) right--; else left++; } return list; }
}