1.查找法
两层遍历,最直观
时间复杂度: O(N*N)
代码实现:
public int[] twoSum(int[] numbers, int target) {
// write your code here
int[] result = new int[2];
int firstIndex = 0;
int secondIndex = 0;
for (int i = 0; i < numbers.length - 1; i++) {
firstIndex = i;
for (int j = i + 1; j < numbers.length; j++) {
secondIndex = j;
if ((numbers[firstIndex] + numbers[secondIndex]) == target) {
result[0] = firstIndex;
result[1] = secondIndex;
}
}
}
return result;
}
2. 利用Map
时间复杂度:O(N)
第一遍遍历:将(target-a)和i 作为键值对,存入Hash表,遍历时间复杂度为O(n),
第二遍遍历:查询在Hash表中有和当前数相同的key,每次查询时间复杂度为O(1),遍历时间复杂度为O(n),
总的时间复杂度是O(2n)。
代码实现:
public int[] twoSum(int[] numbers, int target) {
// write your code here
int[] result = new int[2];
Map<Integer, Integer> map = new HashMap<>();
// 1. 将数组中对应的值与target差值及下标放入map中
for (int i = 0; i < numbers.length; i++) {
map.put(target -numbers[i], i);
}
// 2. 查询在Hash表中有和当前数相同的key
for (int j = 0; j < numbers.length; j++) {
// 3.可能存在一个数x,满足x*2=target,i!=map.get(nums[i])可以避免
if (map.containsKey(numbers[j]) == true && j!=map.get(numbers[j])) {
result[0] = j > map.get(numbers[j]) ? map.get(numbers[j]) : j;
result[1] = j > map.get(numbers[j]) ? j : map.get(numbers[j]);
break;
}
}
return result;
}