一、题目
题目说明:
给定一个整数数组 nums
和一个整数目标值 target
,请你在该数组中找出 和为目标值 target
的那 两个 整数,并返回它们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。
你可以按任意顺序返回答案。
示例 1:
输入:nums = [2,7,11,15], target = 9
输出:[0,1]
解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。
示例 2:
输入:nums = [3,2,4], target = 6
输出:[1,2]
示例 3:
输入:nums = [3,3], target = 6
输出:[0,1]
提示:
2 <= nums.length <= 104
-109 <= nums[i] <= 109
-109 <= target <= 109
- 只会存在一个有效答案
**进阶:**你可以想出一个时间复杂度小于 O(n2)
的算法吗?
二、思路分析
时间复杂度: O(n)
哈希表,略……
三、AC代码
class Solution {
public int[] twoSum(int[] nums, int target) {
// 预处理各个数的值和索引映射关系
// key -> 值 value -> 索引
Map<Integer, Integer> map = new HashMap<Integer, Integer>();
for (int i = 0; i < nums.length; i ++) {
map.put(nums[i], i);
}
// 遍历寻找答案
int[] res = new int[2];
for (int i = 0; i < nums. length; i ++) {
int key = target - nums[i];
// 如果存在映射且不为当前遍历到的值,即存在答案
if(map.containsKey(key) && i != map.get(key)){
// 记录答案
res[0] = i;
res[1] = map.get(key);
break;
}
}
// 题中说肯定存在答案,因此直接输出即可
return res;
}
}
四、问题记录
3.1、WA记录
class Solution {
public int[] twoSum(int[] nums, int target) {
// 预处理各个数的值和索引映射关系
// key -> 值 value -> 索引
Map<Integer, Integer> map = new HashMap<Integer, Integer>();
for (int i = 0; i < nums.length; i ++) {
map.put(nums[i], i);
}
// 遍历寻找答案
int[] res = new int[2];
for (int i = 0; i < nums. length; i ++) {
int key = target - nums[i];
// 如果存在映射,即存在答案
if(map.containsKey(key)){
// 记录答案
res[0] = i;
res[1] = map.get(key);
break;
}
}
// 题中说肯定存在答案,因此直接输出即可
return res;
}
}
测试用例
Testcase
[3,2,4]
6
Answer
[0,0]
Expected Answer
[1,2]
问题分析
没看清题目:数组中同一个元素在答案里不能重复出现
3.1、HashMap中无法使用Int
在声明HashMap的时候,用了如下的写法报错。
Map<int, int> map = new HashMap<int, int>();
Map 的键和值不能使用基本数据类型作为类型参数,因为泛型类型参数不能是基本数据类型,而只能是对象类型。
3.3、关于int数组的初始化
有点忘记怎么初始化int数组了…,在这里复习一下
声明:
int[] arr = new int[4];
声明&初始化:
int[] arr = new int[]{1,2};
直接初始化
int[] arr = {1,2};