LeetCode 每日一題,用 Go 實現兩數之和的非暴力解法

小邓發表於2024-11-04

題目

給定一個整數陣列 nums 和一個整數目標值 target,請你在該陣列中找出 和為目標值 target  的那 兩個 整數,並返回它們的陣列下標。

你可以假設每種輸入只會對應一個答案,並且你不能使用兩次相同的元素。

你可以按任意順序返回答案。

示例 1:

輸入:nums = [2,7,11,15], target = 9
輸出:[0,1]
解釋:因為 nums[0] + nums[1] == 9 ,返回 [0, 1] 。
示例 2:

輸入:nums = [3,2,4], target = 6
輸出:[1,2]
示例 3:

輸入:nums = [3,3], target = 6
輸出:[0,1]

提示:

2 <= nums.length <= 104
-109 <= nums[i] <= 109
-109 <= target <= 109
只會存在一個有效答案

思路

1、使用 Hash 表(Go 語言中是 map 型別)儲存遍歷過程中的陣列元素和下標,從而避免使用 for for 兩層迴圈的暴力解法,將時間複雜度從O(N^2)降低到O(N)。

2、指定 Hash 表的初始容量,避免執行中的記憶體重新分配。

解題過程

1、初始化一個空的雜湊表 hashMap 來儲存遍歷過的數字及其索引。

2、遍歷陣列 nums,對於每個元素 nums[i]:

  • 計算 target-v,得到與當前元素配對的目標數字。
  • 檢查這個目標數字是否已經在 hashMap 中存在:
    • 如果存在,說明找到了一對數字,它們的和等於目標值,返回它們的索引。
    • 如果不存在,將當前元素及其索引存入 hashMap。

3、如果遍歷結束後沒有找到任何一對數字,返回 nil。

複雜度

  • 時間複雜度: O(n)
  • 空間複雜度: O(n)

Code

func toSum(nums []int, target int) []int {  
    hashMap := make(map[int]int, len(nums))  
    for k, v := range nums {  
       if p, ok := hashMap[target-v]; ok {  
          return []int{p, k}  
       }  
       hashMap[v] = k  
    }  
    return nil  
}

執行結果

image

引用:https://leetcode.cn/problems/two-sum/solutions/2976507/goyu-yan-liang-shu-zhi-he-ti-jie-by-deng-pp8x

相關文章