跳转至

LC1 - 两数之和

TwoSum.go
package HashTable

import (
    "cmp"
    "slices"
)

func twoSum(nums []int, target int) []int {
    return twoSum1(nums, target)
}

type indexedNum struct {
    Value int
    Index int
}

// 时间复杂度: O(n * log n), 空间复杂度: O(n)
func twoSum1(nums []int, target int) []int {
    indexedNums := make([]indexedNum, len(nums))
    for i, num := range nums {
        indexedNums[i] = indexedNum{num, i}
    }
    slices.SortFunc(indexedNums, func(a, b indexedNum) int {
        return cmp.Compare(a.Value, b.Value)
    })
    left, right := 0, len(nums)-1
    for left < right {
        sum := indexedNums[left].Value + indexedNums[right].Value
        if sum == target {
            return []int{indexedNums[left].Index, indexedNums[right].Index}
        } else if sum > target {
            right--
        } else {
            left++
        }
    }
    return nil
}

// 时间复杂度: O(n), 空间复杂度: O(n)
func twoSum2(nums []int, target int) []int {
    hashTable := make(map[int]int)
    for index2, num2 := range nums {
        num1 := target - num2
        if index1, ok := hashTable[num1]; ok {
            return []int{index1, index2}
        } else {
            hashTable[num2] = index2
        }
    }
    return nil
}

第一反应是排序后双指针,但由于需要返回原数组索引而非数值,因此必须借助辅助数组。