问题描述:输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的。
思路1:从数组两端向中间查找满足条件的两个数
开始还在纠结乘积最小,后来转念一想,a+b=sum,a和b越远乘积越小,而一头一尾两个指针往内靠近的方法找到的就是乘积最小的情况。
如果是乘积最大的情况就是一直找到两个指针重合,每次找到一个就将之前返回的结果向量清空然后更新为新找到的。
i和j表示数组两端下标
当array[i]+array[j]>S时,j-- 尾端向前移动,两数据和增大
当array[i]+array[j]=S时,将array[i],array[j]依次添加到ArrayList中,
当array[i]+array[j]<S时,i++前段向后移动,两数据和减小
代码:
import java.util.ArrayList; public class Solution { public ArrayList<Integer> FindNumbersWithSum(int [] array,int sum) { ArrayList<Integer> list = new ArrayList<Integer>(); int left = 0; int right = array.length-1; while(left < right){ int num = array[left] + array[right]; if(num == sum){ list.add(array[left]); list.add(array[right]); return list; }else if(num < sum){ left++; }else{ right--; } } return list; } }
运行时间:17ms
占用内存:9288k
思路2:用HashMap存放元素和下标,然后开始遍历数组找到和为sum的两个元素,从左到右找到的第一对和为sum的就是最小的一对。
import java.util.ArrayList; import java.util.HashMap; public class Solution { public ArrayList<Integer> FindNumbersWithSum(int [] array,int sum) { HashMap map = new HashMap(); ArrayList<Integer> result = new ArrayList(); int len = array.length; for (int i = 0; i < len; i++) { map.put(array[i], i); } for (int i = 0; i < len; i++) { int sub = sum - array[i]; if (map.containsKey(sub)) { result.add(array[i]); result.add(sub); break; } } return result; } }
运行时间:14ms
占用 内存:9276k