返回

Go语言实现:LeetCode 1. 两数之和

后端

问题的

给定一个整数数组 nums 和一个目标值 target,请找出两个数字的下标,使得这两个数字之和等于 target。你可以假设每个输入只有一个解,并且你不能重复使用同一个元素。

实现过程:

1. 暴力求解

最简单的方法是使用暴力求解法,即遍历数组中的所有元素,并检查每一个元素与其他所有元素之和是否等于 target。如果找到这样的两个元素,则返回它们的下标。

func twoSum(nums []int, target int) []int {
  for i := 0; i < len(nums); i++ {
    for j := i + 1; j < len(nums); j++ {
      if nums[i] + nums[j] == target {
        return []int{i, j}
      }
    }
  }
  return nil
}

2. 使用哈希表

我们可以使用哈希表来存储数组中的元素及其下标。然后,对于每个元素,我们可以检查其补数(即 target - nums[i])是否在哈希表中。如果在,则返回该元素的下标和补数的下标。

func twoSum(nums []int, target int) []int {
  hashmap := make(map[int]int)
  for i, num := range nums {
    complement := target - num
    if idx, ok := hashmap[complement]; ok {
      return []int{idx, i}
    }
    hashmap[num] = i
  }
  return nil
}

3. 排序数组

我们可以先将数组进行排序,然后使用双指针法来查找两个元素之和等于 target 的下标。

func twoSum(nums []int, target int) []int {
  sort.Ints(nums)
  left, right := 0, len(nums)-1
  for left < right {
    sum := nums[left] + nums[right]
    if sum == target {
      return []int{left, right}
    } else if sum < target {
      left++
    } else {
      right--
    }
  }
  return nil
}

时间和空间复杂度分析:

  • 暴力求解法 :时间复杂度为 O(n^2),空间复杂度为 O(1).
  • 使用哈希表 :时间复杂度为 O(n),空间复杂度为 O(n).
  • 排序数组 :时间复杂度为 O(nlogn),空间复杂度为 O(1).

总结:

在本文中,我们介绍了三种解决 LeetCode 1. 两数之和问题的方法。这些方法各有优缺点,您可以根据具体情况选择合适的方法。如果您需要更高的性能,可以使用哈希表或排序数组的方法。如果您需要更简单的实现,可以使用暴力求解法。