题目描述
给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。
你可以按任意顺序返回答案。 **
示例:
输入:nums = [2,7,11,15], target = 9
输出:[0,1]
解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。
提示:
- 2 <= nums.length <= 104
- -109 <= nums[i] <= 109
- -109 <= target <= 109
- 只会存在一个有效答案
解题思路
-
暴力解题:
a. 顺序选取数组中的数,记为A,在数组中位于A后面的数字中寻找满足A+B=target
的数B
b. 重复上述步骤,直到找到 A 和 B时间复杂度: O ( N 2 ) O(N^2) O(N2)
空间复杂度:O(1) -
哈希表:
初始化空哈希表(key = element, value = index),遍历给定的数组
a. 遍历到的当前数字记为A,若哈希表中存在满足A+B=target
的数B,返回数A、B的下标
b. 否则将当前数A和其对应下标 incex 放到哈希表中,key = A, value = index时间复杂度: O ( N ) O(N) O(N)
空间复杂度:O(N)注意:
1、因为题目中有明确:只会存在一个有效答案,所以可以边遍历边计算结果。并且因为可能有重复的数字,所以不能先给哈希表赋值,再求解结果。例如:数组={2,3,4,3},target = 6,如果先给哈希表赋值,3因为key相同,在哈希表中只会出现一次,导致求解错误。
2、如果题目允许有多个有效答案,依然可以使用哈希表,对应的value应该改为List,表示下标的列表,并修改:
代码实现
public class Add2Nums {
//暴力解题
private static int[] forceSolution(int[] nums, int target) {
for(int i = 0; i < nums.length; i++){
for(int j = i + 1; j < nums.length; j++){
if(nums[i] + nums[j] == target){
return new int[]{i, j};
}
}
}
return new int[0];
}
//哈希表
private static int[] hashSolution(int[] nums, int target){
Map<Integer, Integer> eleIndexMap = new HashMap<>();
for(int i = 0; i < nums.length; i++){
if(eleIndexMap.containsKey(target - nums[i])){
return new int[]{eleIndexMap.get(target - nums[i]), i};
}
eleIndexMap.put(nums[i], i);
}
return new int[0];
}
public static void main(String[] args){
int[] nums = {2,7,11,15};
int target = 26;
System.out.println(Arrays.toString(forceSolution(nums, target)));
System.out.println(Arrays.toString(hashSolution(nums, target)));
}
}