1. Two Sum

题目

Given an array of integers, return indices of the two numbers such that they add up to a specific target.

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

Example:

Given nums = [2, 7, 11, 15], target = 9,

Because nums[0] + nums[1] = 2 + 7 = 9, return [0, 1].

題目大意

在數組中找到 2 個數之和等於給定值的數字, 結果返回 2 個數字在數組中的下標.

解題思路

  • 暴力解: 時間複雜 O(n^2), 空間複雜 O(1)

  • 這道題最優的做法時間複雜度是 O(n) 順序掃描數組, 對每一個元素,在 map 中找能組合給定值的另一半數字, 如果找到了, 直接返回 2 個數字的下標即可. 如果找不到, 就把這個數字存入 map 中, 等待掃到“另一半”數字的時候, 再取出來返回結果.

  • 如果nums是有序 可以使用左右指針

來源

解答

https://github.com/kimi0230/LeetcodeGolang/blob/master/Leetcode/0001.Two-Sum/twosum.go

package twosum

// 時間複雜 O(n^2), 空間複雜 O(1)
func Twosum(nums []int, target int) []int {
    for i, _ := range nums {
        for j := i + 1; j < len(nums); j++ {
            if target == nums[i]+nums[j] {
                return []int{i, j}
            }
        }
    }
    return []int{0, 0}
}

func Twosum2(nums []int, target int) []int {
    m := make(map[int]int)
    for i, v := range nums {
        if idx, ok := m[target-v]; ok {
            return []int{idx, i}
        }
        m[v] = i
    }
    return []int{0, 0}
}

// 如果nums是有序 可以使用左右指針
// func Twosum3(nums []int, target int) []int {
//     left, right := 0, len(nums)-1
//     sort.Ints(nums)

//     for left < right {
//         sum := nums[left] + nums[right]
//         if sum == target {
//             return []int{left, right}
//         } else if sum < target {
//             left++
//         } else if sum > target {
//             right--
//         }
//     }
//     return []int{0, 0}
// }
© Kimi Tsai all right reserved.            Updated : 2024-05-06 09:36:37

results matching ""

    No results matching ""