- 前言:受上一题的启发,这题自己也编出来了。在碰到这种有序数列的时候,经常会用到双指针法,一个指左边,一个指右边,然后依照规则移动,增加或缩小范围。很实用。
- 题目:
输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。
- 思路:左右夹逼法(双指针),从left=最左边,right=最右边,开始找,left的指向值加上right的指向值大于S时,right指针往左移动下,否则,left指针往右移动下,要是俩值和刚好为S,那么就存储S并输出。因为两个数离的越远,乘积时越小的,那么第一次找到的两个数,即为所求。
- 代码:
package cn.test42;
import java.util.ArrayList;
public class test {
//测试用例
public static void main(String[] args){
Solution solution=new Solution();
int[] a={1,2,3,4,5,6,7,8,9,10};
ArrayList result=solution.FindNumbersWithSum(a,13);
System.out.println(result.size());
System.out.println(result.get(0));
System.out.println(result.get(1));
}
}
class Solution {
public ArrayList<Integer> FindNumbersWithSum(int [] array,int sum) {
ArrayList<Integer> result=new ArrayList<Integer>();
if (array == null || array.length <= 0)
return result;
int left = 0;//左指针
int right = array.length - 1;//右指针
while (right > left) {
if (array[left] + array[right] < sum) {//和值小于sum,则左指针右移
left = left + 1;
}else if(array[left]+array[right]>sum){
right=right-1;
}else{
result.add(array[left]);
result.add(array[right]);
break;//找到了第一组符合要求的,则跳出循环
}
}
return result;
}
}