剑指offer-和为S的两个数字
题目描述
输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。
输出描述:
对应每个测试案例,输出两个数,小的先输出。
方法一:使用set保存访问过得结点,新结点array[i]判断sum-array[i]是否在set中,时间复杂度为O(n),但是这种方法求得的是乘积最大值,不符合题意。
方法二:当前结点array[i],从后往前循环数组判断sum-array[i]是否存在,时间复杂度为O(n2)。若查找sum-array[i]使用二分优化,时间复杂度为O(nlogn).
1 public ArrayList<Integer> FindNumbersWithSum(int [] array,int sum) {//my 2 ArrayList<Integer> re = new ArrayList<Integer>(); 3 for(int i=0;i<array.length;i++){ 4 int y = sum-array[i]; 5 for(int j =array.length-1;j>i;j--){ 6 if(array[j]==y){ 7 re.add(array[i]); 8 re.add(y); 9 return re; 10 } 11 } 12 } 13 return re; 14 }
方法三:头尾指针,从两边往中间夹,时间复杂度为O(n)
1 public ArrayList<Integer> FindNumbersWithSum(int [] array,int sum) {//mytip 2 ArrayList<Integer> re = new ArrayList<Integer>(); 3 int i=0; 4 int j=array.length-1; 5 while(i<j){ 6 if(array[i]+array[j]==sum){ 7 re.add(array[i]); 8 re.add(array[j]); 9 break; 10 } 11 else if(array[i]+array[j]>sum){ 12 j--; 13 } 14 else{ 15 i++; 16 } 17 } 18 return re; 19 }
相关题
LeetCode1 两数之和 https://www.cnblogs.com/zhacai/p/10429120.html