题目描述
分析
思路: 通过map来降低算法的时间复杂度为O(1),在遍历的过程中结合map来判断是否有满足和为S的值,如果找到了则根据乘积判断是否需要更新结果。
map保存数据:
HashMap<Integer,Integer> map = new HashMap();
for(int a : array) {
map.put(a, 1);
}
遍历比较判断更新:
map.containsKey(sum - array[i])使得复杂度大大降低。
考虑num1和num2的大小关系。
找到后flag置为true标记一下。
for(int i = 0; i < array.length; i++) {
if(map.containsKey(sum - array[i])) {
if(array[i] * (sum - array[i]) < min) {
min = array[i] * (sum - array[i]);
if(array[i] > sum - array[i]) {
num1 = sum - array[i];
num2 = array[i];
}else {
num2 = sum - array[i];
num1 = array[i];
}
flag = true;
}
}
}
结果集生成:
如果没有找到就不会添加这两个数。
ArrayList<Integer> list = new ArrayList();
if(flag == true) {
list.add(num1);
list.add(num2);
}
完整代码
import java.util.*;
public class Solution {
public ArrayList<Integer> FindNumbersWithSum(int [] array,int sum) {
int min = 10000;
int num1 = 0;
int num2 = 0;
boolean flag = false;
HashMap<Integer,Integer> map = new HashMap();
for(int a : array) {
map.put(a, 1);
}
for(int i = 0; i < array.length; i++) {
if(map.containsKey(sum - array[i])) {
if(array[i] * (sum - array[i]) < min) {
min = array[i] * (sum - array[i]);
if(array[i] > sum - array[i]) {
num1 = sum - array[i];
num2 = array[i];
}else {
num2 = sum - array[i];
num1 = array[i];
}
flag = true;
}
}
}
ArrayList<Integer> list = new ArrayList();
if(flag == true) {
list.add(num1);
list.add(num2);
}
return list;
}
}