实现方法
- 递归
- 遍历数组 nums,使用两个嵌套的循环:
- 外层循环遍历数组中的每个元素 num,并获取其索引 i。
- 内层循环从当前元素的下一个位置开始遍历数组,获取索引 j。
- 对于每一对元素 (nums[i], nums[j]),判断它们的和是否等于目标值 target。
- 如果找到一对元素的和等于目标值,则直接返回它们的索引 [i, j]。
- 如果遍历完数组后仍未找到符合条件的两个元素,则返回空数组。
- 这种方法的时间复杂度为 O(n^2),其中 n 是数组中的元素个数。由于需要遍历数组的所有可能组合,因此效率较低,不适用于大规模数据的情况。
func twoSum(nums []int, target int) []int {
// 遍历数组中的每个元素
for i, num := range nums {
// 从当前元素的下一个位置开始遍历数组
for j := i + 1; j < len(nums); j++ {
// 如果当前元素与后面的元素之和等于目标值
if num+nums[j] == target {
// 返回两个元素的索引
return []int{i, j}
}
}
}
// 如果未找到符合条件的两个元素,则返回空数组
return nil
}
- 哈希表
- 创建一个空的哈希表 hashTable,用于存储数组中的值及其对应的索引。
- 遍历数组 nums,在遍历的过程中,将数组中的每个元素值及其索引存入哈希表中。
- 对于数组中的每个元素 num,判断 target - num 是否在哈希表中存在,如果存在,则说明找到了两个数之和等于 target 的数。
- 如果找到了符合条件的两个数,直接返回它们的索引即可。
- 如果没有找到符合条件的两个数,则将当前元素值及其索引存入哈希表中,以便后续的查找过程。
- 如果遍历完成后仍然没有找到符合条件的两个数,则返回 nil。
- 通过使用哈希表,我们可以在 O(1) 的时间复杂度内判断一个元素是否在哈希表中,因此整个算法的时间复杂度为 O(n),其中 n 是数组中的元素个数。
func twoSum(nums []int, target int) []int {
hashTable := map[int]int{}
// 用map存储数据,key为nums中的值,value为索引
// 遍历nums,将nums[i]和target-nums[i]的值作为key存入map中,
// 如果map中已经存在该key,则说明找到了两个数之和为target的数
for i, num := range nums {
if j, ok := hashTable[target-nums[i]]; ok {
return []int{i, j}
}
// 将未找到的数据存入map中
hashTable[num] = i
}
return nil
}