返回

LeetCode 0x0001 Two Sum 题解:清晰阐释,Go 代码轻松上手

闲谈

1. 题解概要

  • 给定一个整数数组nums和一个目标值target,找出两个整数的组合,使得它们的和等于target。

  • 要求:

    • 每个整数只能使用一次。
    • 返回这两个整数在nums中的下标。

2. 解法剖析

2.1 指针法

指针法通过双指针遍历数组,寻找满足要求的两个整数。

func twoSum(nums []int, target int) []int {
  // 初始化两个指针i和j,i指向数组开头,j指向数组末尾。
  i, j := 0, len(nums)-1

  // 当指针i和j未相遇时,继续循环。
  for i < j {
    // 计算两个指针所指整数之和。
    sum := nums[i] + nums[j]

    // 根据sum与target的关系,调整指针位置。
    if sum == target {
      return []int{i, j}
    } else if sum < target {
      i++
    } else {
      j--
    }
  }

  // 未找到满足要求的整数组合,返回空切片。
  return []int{}
}

2.2 字典法

字典法通过字典存储已经遍历过的整数和它们在nums中的下标。

func twoSum(nums []int, target int) []int {
  // 初始化字典m。
  m := make(map[int]int)

  // 遍历数组。
  for i, num := range nums {
    // 计算差值。
    diff := target - num

    // 如果差值在字典中,则返回两个整数的下标。
    if idx, ok := m[diff]; ok {
      return []int{idx, i}
    }

    // 将当前整数及其下标添加到字典中。
    m[num] = i
  }

  // 未找到满足要求的整数组合,返回空切片。
  return []int{}
}

3. 复杂度分析

3.1 指针法

  • 时间复杂度:O(n),其中n是数组nums的长度。最坏情况下,需要遍历整个数组。
  • 空间复杂度:O(1),不使用额外空间。

3.2 字典法

  • 时间复杂度:O(n),其中n是数组nums的长度。最坏情况下,需要遍历整个数组。
  • 空间复杂度:O(n),需要使用哈希表存储已经遍历过的整数。

4. 结语

通过本文,您已经掌握了LeetCode 0x0001 Two Sum 这道题的两种解法,并深入了解了它们的复杂度。无论您是刚入门还是经验丰富的程序员,都可以通过本文有所收获。如果您有任何疑问或建议,欢迎在评论区留言。

Happy Coding!