LeetCode01 两数之和
题目描述
给定一个整数数组 nums
和一个目标值 target
,请你在该数组中找出和为目标值的那两个整数,并返回他们的数组下标。
你可以假设每种输入只会对应一个答案。但是,数组中同一个元素不能使用两遍。
Tips:
- 返回的是下标
- 保证有解
样例
给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
算法分析
暴力做法:两重循环 O(n*n)
哈希表
- 问题的转换:一个数
a
,要找到target-a
, (a之前) - 用哈希表存储前面遍历过的数,枚举当前这个数
nums[i]
时,找哈希表中找target-nums[i]
,循环一遍即可
时间复杂度 $O(n)$
Java代码
class Solution {
public int[] twoSum(int[] nums, int target) {
HashMap<Integer, Integer> map = new HashMap<Integer, Integer>();
//开始遍历一遍
for(int i = 0;i<nums.length;i++){
int b = target - nums[i];
if(map.containsKey(b)){
return new int[]{map.get(b),i}; //键 值 值 是存储的下标
}
map.put(nums[i], i);
}
return new int[]{-1, -1};
}
}
Map
中值存储的是我们的下标