目录

题目来源

题目描述

示例

提示

题目解析

算法源码

题目来源

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 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]

相关文章

评论可见,请评论后查看内容,谢谢!!!评论后请刷新页面。