和为S的数字
题目描述
1、输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。
2、小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100。但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数)。没多久,他就得到另一组连续正数和为100的序列:18,19,20,21,22。
思路分析
1、为求出乘积最小的两个数,双指针遍历数组。代码如下:
public ArrayList<Integer> FindNumbersWithSum(int [] array,int sum) {
ArrayList<Integer> list=new ArrayList<>();
if(array==null||array.length<2)return list;
int left=0,right=array.length-1;
while(left<right){
if(array[left]+array[right]==sum){
list.add(array[left]);
list.add(array[right]);
return list;
}else if(array[left]+array[right]>sum){
right--;
}else{
left++;
}
}
return list;
}
2、思路类似于第一题。代码如下:
public ArrayList<ArrayList<Integer>> FindContinuousSequence(int sum) {
ArrayList<ArrayList<Integer>> res=new ArrayList<>();
if(sum<3)return res;
int low=1,high=2;
while(high>low){
int curSum=(high+low)*(high-low+1)/2;
if(curSum==sum){
ArrayList<Integer> list=new ArrayList<>();
for(int i=low;i<=high;i++){
list.add(i);
}
res.add(list);
low++;
}else if(curSum>sum){
low++;
}else{
high++;
}
}
return res;
}