先来看看给的例子:
Given nums = [2, 7, 11, 15], target = 9, Because nums[0] + nums[1] = 2 + 7 = 9, return [0, 1].
如果有满足target = 9的,就返回下标。
解法1:
我们先可以有一个很直接的解法:
遍历数组中每个一个元素A,再看它后面的元素B ,A + B 是否等于target
复杂度:
时间复杂度:O (n^2)
空间复杂度:O (1)
效率:
代码:
public int[] twoSum(int[] nums, int target) {
return twoSumHash(nums, target);
}
private int[] twoSumBruteForce(int[] nums, int target) {
int[] result = new int[2];
for (int i = 0; i < nums.length; i++) {
for (int j = i + 1; j < nums.length; j++) {
if (nums[j] + nums[i] == target) {
result[0] = i;
result[1] = j;
return result;
}
}
}
return result;
}
解法2:
解法1中,对于每一个数,我们找它后面的数的时间复杂度为O(1),能不能有更好的方法直接找到呢?
可以的, 利用hashmap的方法,先遍历一遍数组,将所有的元素存进去
接着遍历一遍数组,对于每一个元素,直接去hashmap中找有没有符合条件的(注意:找到的元素不能是它本身)
复杂度:
时间复杂度O(n)
空间复杂度O(n)
效率:
代码:
public int[] twoSum(int[] nums, int target) {
return twoSumHash(nums, target);
}
private int[] twoSumHash(int[] nums, int target) {
Map<Integer, Integer> store = new HashMap<>();
for (int i = 0; i < nums.length; i++) {
store.put(nums[i], i);
}
for (int i = 0; i < nums.length; i++) {
if (store.containsKey(target - nums[i])) {
int index = store.get(target - nums[i]);
if (index != i) {
return new int[]{i, index};
}
}
}
return new int[2];
}