原文地址:Go-Leecode-兩數之和(刷題記錄)
給定整數陣列nums及整數目標值target,需在nums中找到兩數和為target值的下標,陣列中同一元素不能重復出現且只有一組元素和為target值,可按任意順序回傳結果,以下為三個示例:
示例一:
輸入:nums = [2,7,11,15], target = 9輸出:[0,1]
這里稍微解釋一下哈,因為nums的第一個元素加上第二個元素為target值,所以需回傳這兩個元素的下標值,以下同理哈,
示例二:
輸入:nums = [3,2,4], target = 6輸出:[1,2]
示例三:
輸入:nums = [3,3], target = 6輸出:[0,1]
以下為部分提示:
-
2 <= nums.length <= 103,
-
-109 <= nums[i] <= 109,
-
-109 <= target <= 109,
-
只存在一個有效答案,
這題目拿到手之后,下意識就想到了暴力輸出的方案,如下:
func twoSum(nums []int, target int) []int {
n := len(nums)
for i := 0; i < n-1; i++ {
for j := i + 1; j < n; j++ {
if nums[i] + nums[j] == target {
return []int{i, j}
}
}
}
return nil
}
但仔細想了想,可以考慮使用哈希表索引的方式來實作,如下:
func twoSum(nums []int, target int) []int {
numIndex := make(map[int]int, len(nums))
for i, num := range nums {
numIndex[num] = i
}
for i, num := range nums {
pair := target - num
// 這一步主要是為了剔除自身相加的情況
// 使用哈希表需要注意,索引重疊是同一元素
if j, ok := numIndex[pair]; ok && i != j {
return []int{i, j}
}
}
return nil
}
個人認為哈希表特別適合抽象類的配對結構,當要解決問題的資料單元是成對資料關系時,可以考慮使用哈希表map結構,
以上代碼仔細考慮一下的話,進行了兩次for回圈,感徑訓可以再優化一點點,將兩次回圈合并,一遍回圈,一邊檢查,來看下:
func twoSum(nums []int, target int) []int {
numIndex := make(map[int]int, len(nums))
for i, num := range nums {
pair := target - num
if j, ok := numIndex[pair]; ok && i != j {
return []int{j, i}
}
numIndex[num] = i
}
return nil
}
至此,本次分享就結束了,后期會慢慢補充,
以上僅為個人觀點,不一定準確,能幫到各位那是最好的,
好啦,到這里本文就結束了,喜歡的話就來個三連擊吧,
掃碼關注公眾號,獲取更多優質內容,

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/395046.html
標籤:其他
上一篇:homework2
下一篇:homework3
