返回介绍

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

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

1. Two Sum

中文文档

Description

Given an array of integers nums and an integer target, return _indices of the two numbers such that they add up to target_.

You may assume that each input would have _exactly_ one solution, and you may not use the _same_ element twice.

You can return the answer in any order.

 

Example 1:

Input: nums = [2,7,11,15], target = 9
Output: [0,1]
Explanation: Because nums[0] + nums[1] == 9, we return [0, 1].

Example 2:

Input: nums = [3,2,4], target = 6
Output: [1,2]

Example 3:

Input: nums = [3,3], target = 6
Output: [0,1]

 

Constraints:

  • 2 <= nums.length <= 104
  • -109 <= nums[i] <= 109
  • -109 <= target <= 109
  • Only one valid answer exists.

 

Follow-up: Can you come up with an algorithm that is less than O(n<sup>2</sup>) time complexity?

Solutions

Solution 1: Hash Table

We can use the hash table $m$ to store the array value and the corresponding subscript.

Traverse the array nums, when you find target - nums[i] in the hash table, it means that the target value is found, and the index of target - nums[i] and $i$ are returned.

The time complexity is $O(n)$ and the space complexity is $O(n)$. Where $n$ is the length of the array 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 和您的相关数据。
    原文