箭指offer:和为S的两个数字
问题描述:输入一个递增排序的数组和一个数字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
浙公网安备 33010602011771号