dcddc

西米大人的博客

0%

两数之和

题目描述

给一个整数数组,找到两个数使得他们的和等于一个给定的数 target。
你需要实现的函数twoSum需要返回这两个数的下标, 并且第一个下标小于第二个下标。注意这里下标的范围是 1 到 n,不是以 0 开头。
你可以假设只有一组答案。

思路

因为要找两数之和等于target,但数组未排序,显然如果暴力查找时间复杂度太大
给数组排序后可以很容易找到两数之和等于target,但新问题是:排序会打乱原来元素的顺序,就无法得到这两个数在原数组准确的下标了。
综上,可以这么处理:

  • 用一个hashmap保存该数组,key为下标+1,value就是数组的值
  • 数组排序
  • 找到这两个数
  • 自己写一个通过value找到key的函数,输出下标
    通过value找key也很容易,通过keyset集可以轻松遍历map里的value,比较相等后将key添加到int[]数组即可。

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
public int[] twoSum(int[] numbers, int target) {
HashMap<Integer, Integer> hashMap = new HashMap<>();
int tmpIndex = 1;
for(int num : numbers) {
hashMap.put(tmpIndex++, num);
}
Arrays.sort(numbers);
int i = 0;
int j = numbers.length-1;
while(i < j) {
if(target < numbers[i]+numbers[j]) {
j--;
}else if (target > numbers[i]+numbers[j]) {
i++;
}else {
return getKey(hashMap, numbers[i], numbers[j]);
}
}
return new int[]{};
}

private int[] getKey(HashMap<Integer, Integer> hashMap, int value1, int value2) {
int[] res = new int[2];
int i = 0;
Set<Integer> keySet = hashMap.keySet();
for(int key : keySet) {
if(hashMap.get(key) == value1 || hashMap.get(key) == value2) {
res[i++] = key;
}
}
return res;
}

考察点

  • hashmap的应用