目录
题目来源
题目描述
示例
提示
题目解析
算法源码
题目来源
1. 两数之和 - 力扣(LeetCode)
题目描述
给定一个整数数组 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
- -10^9 <= nums[i] <= 10^9
- -10^9 <= target <= 10^9
- 只会存在一个有效答案
题目解析
本题其实就是要找一个和为target的二元组。
但是题目要求返回二元组中元素的下标,因此我们不能改变nums的顺序,因为这样会打乱下标。
本题最佳的解题思路是:
首先,定义一个字典map,其key就是num,value就是该num上一次出现的下标。
然后,遍历nums数组,将遍历到元素nums[i] 作为 num1,
那么,如果要形成一个和为target的二元组,且其中一个元素是num1,则另一个元素num2必然等于target - num1,我们只需要检查map中是否存在num2即可:
- 如果map中存在key=num2,那么可以取当前num1的下标 i,和num2的下标map.get(num2)作为题解直接返回,因为题目备注说:只会存在一个有效答案
- 如果map中不存在key=num2,则说明nums中不存在这样一个二元组,此时我们需要记录num1的下标到map中
需要注意的是,上面逻辑中map总是记录num的上一次下标位置,而不是记录num出现过的所有下标位置,这样不仅节省内存,而且可以避免下面这种情况
nums = [1,2,3],target = 4
上面例子中,
如果我们让map统计所有num的下标后
map = { 1: [0], 2: [1], 3: [2] }
则遍历nums[1]时,即num1 = 2,此时计算num2 = target - num1 = 2
接着我们会发现map中存在key=num2,从而得出错误的解,返回num1的下标1,和num2的下标1。
如果我们只是让map统计num的最近一个下标,则遍历到nums[1]时,
map = {1: 0}
此时num1 = 2,num2 = target - num1 = 2,我们去map中找key=num2是没有的,因此可以避免上面错误发生
Java算法源码
import java.util.HashMap;
class Solution {
public int[] twoSum(int[] nums, int target) {
HashMap<Integer, Integer> map = new HashMap<>();
for (int i = 0; i < nums.length; i++) {
int num1 = nums[i];
int num2 = target - nums[i];
if (map.containsKey(num2)) {
return new int[] {map.get(num2), i};
} else {
map.put(num1, i);
}
}
return new int[0];
}
}
JS算法源码
/**
* @param {number[]} nums
* @param {number} target
* @return {number[]}
*/
var twoSum = function (nums, target) {
const map = {};
for (let i = 0; i < nums.length; i++) {
const num1 = nums[i];
const num2 = target - num1;
if (map[num2] != undefined) {
return [map[num2], i];
} else {
map[num1] = i;
}
}
};
Python算法源码
class Solution(object):
def twoSum(self, nums, target):
"""
:type nums: List[int]
:type target: int
:rtype: List[int]
"""
map = {}
for i in range(len(nums)):
num1 = nums[i]
num2 = target - num1
if map.get(num2) is None:
map[num1] = i
else:
return [map[num2], i]