返回介绍

solution / 0000-0099 / 0001.Two Sum / README

发布于 2024-06-17 01:04:41 字数 6161 浏览 0 评论 0 收藏 0

1. 两数之和

English Version

题目描述

给定一个整数数组 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) 的算法吗?

解法

方法一:哈希表

我们可以用哈希表 $m$ 存放数组值以及对应的下标。

遍历数组 nums,当发现 target - nums[i] 在哈希表中,说明找到了目标值,返回 target - nums[i] 的下标以及 $i$ 即可。

时间复杂度 $O(n)$,空间复杂度 $O(n)$。其中 $n$ 是数组 nums 的长度。

class Solution:
  def twoSum(self, nums: List[int], target: int) -> List[int]:
    m = {}
    for i, x in enumerate(nums):
      y = target - x
      if y in m:
        return [m[y], i]
      m[x] = i
class Solution {
  public int[] twoSum(int[] nums, int target) {
    Map<Integer, Integer> m = new HashMap<>();
    for (int i = 0;; ++i) {
      int x = nums[i];
      int y = target - x;
      if (m.containsKey(y)) {
        return new int[] {m.get(y), i};
      }
      m.put(x, i);
    }
  }
}
class Solution {
public:
  vector<int> twoSum(vector<int>& nums, int target) {
    unordered_map<int, int> m;
    for (int i = 0;; ++i) {
      int x = nums[i];
      int y = target - x;
      if (m.count(y)) {
        return {m[y], i};
      }
      m[x] = i;
    }
  }
};
func twoSum(nums []int, target int) []int {
  m := map[int]int{}
  for i := 0; ; i++ {
    x := nums[i]
    y := target - x
    if j, ok := m[y]; ok {
      return []int{j, i}
    }
    m[x] = i
  }
}
function twoSum(nums: number[], target: number): number[] {
  const m: Map<number, number> = new Map();

  for (let i = 0; ; ++i) {
    const x = nums[i];
    const y = target - x;

    if (m.has(y)) {
      return [m.get(y)!, i];
    }

    m.set(x, i);
  }
}
use std::collections::HashMap;

impl Solution {
  pub fn two_sum(nums: Vec<i32>, target: i32) -> Vec<i32> {
    let mut map = HashMap::new();
    for (i, item) in nums.iter().enumerate() {
      if map.contains_key(item) {
        return vec![i as i32, map[item]];
      } else {
        let x = target - nums[i];
        map.insert(x, i as i32);
      }
    }
    unreachable!()
  }
}
/**
 * @param {number[]} nums
 * @param {number} target
 * @return {number[]}
 */
var twoSum = function (nums, target) {
  const m = new Map();
  for (let i = 0; ; ++i) {
    const x = nums[i];
    const y = target - x;
    if (m.has(y)) {
      return [m.get(y), i];
    }
    m.set(x, i);
  }
};
public class Solution {
  public int[] TwoSum(int[] nums, int target) {
    var m = new Dictionary<int, int>();
    for (int i = 0, j; ; ++i) {
      int x = nums[i];
      int y = target - x;
      if (m.TryGetValue(y, out j)) {
        return new [] {j, i};
      }
      if (!m.ContainsKey(x)) {
        m.Add(x, i);
      }
    }
  }
}
class Solution {
  /**
   * @param Integer[] $nums
   * @param Integer $target
   * @return Integer[]
   */
  function twoSum($nums, $target) {
    foreach ($nums as $key => $x) {
      $y = $target - $x;
      if (isset($hashtable[$y])) {
        return [$hashtable[$y], $key];
      }
      $hashtable[$x] = $key;
    }
  }
}
import scala.collection.mutable

object Solution {
  def twoSum(nums: Array[Int], target: Int): Array[Int] = {
  var map = new mutable.HashMap[Int, Int]()
  for (i <- 0 to nums.length) {
    if (map.contains(target - nums(i))) {
    return Array(map(target - nums(i)), i)
    } else {
    map += (nums(i) -> i)
    }
  }
  Array(0, 0)
  }
}
class Solution {
  func twoSum(_ nums: [Int], _ target: Int) -> [Int] {
    var m = [Int: Int]()
    var i = 0
    while true {
      let x = nums[i]
      let y = target - nums[i]
      if let j = m[target - nums[i]] {
        return [j, i]
      }
      m[nums[i]] = i
      i += 1
    }
  }
}
# @param {Integer[]} nums
# @param {Integer} target
# @return {Integer[]}
def two_sum(nums, target)
  nums.each_with_index do |x, idx|
  if nums.include? target - x
    return [idx, nums.index(target - x)] if nums.index(target - x) != idx
  end
  next
  end
end
import std/enumerate

proc twoSum(nums: seq[int], target: int): seq[int] =
  var
    bal: int
    tdx: int
  for idx, val in enumerate(nums):
    bal = target - val
    if bal in nums:
      tdx = nums.find(bal)
      if idx != tdx:
        return @[idx, tdx]

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文