LeetCode - 1 两数之和

目录

题目来源

题目描述

示例

提示

题目解析

算法源码


题目来源

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

LeetCode - 1 两数之和_第1张图片

 

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;
    }
  }
};

LeetCode - 1 两数之和_第2张图片

 

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]

LeetCode - 1 两数之和_第3张图片

你可能感兴趣的:(算法刷题,leetcode,算法,Java,Python,JavaScript)