兩數之和
給定一個整數數組 nums 和一個目標值 target,請你在該數組中找出和爲目標值的那 兩個 整數,並返回他們的數組下標。
你可以假設每種輸入只會對應一個答案。但是,你不能重複利用這個數組中同樣的元素。
示例:
給定 nums = [2, 7, 11, 15], target = 9
因爲 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
Go
遍歷數組
可以通過雙for循環來首先兩數之和
func twoSum(nums []int, target int) []int {
len := len(nums)
result := []int{}
for i:=0; i<len-1; i++{
for j:=i+1; j<len; j++{
if nums[i]+nums[j] == target{
result = append(result, i, j)
return result
}
}
}
return result
}
一遍hash表
一遍哈希表。
在進行迭代並將元素插入到表中的同時,我們還會回過頭來檢查表中是否已經存在可以和當前元素相加得到與target相同的目標元素。如果它存在,那我們已經找到了對應解,並立即將其返回。
步驟
- 構造一個空表 hash = {} // 類似python裏的字典
- 按順序遍歷數組
- 每次通過target-當前元素計算出目標元素的值
- 如果目標元素存在hash表內,說明已經找到,則返回當前元素和目標元素的對應下標即可。
- 若不在表內則需要更新hash表–> hash[當前元素]=地址, 並回到步驟2
- 直到遍歷結束,返回None
func twoSum_hash(nums []int, target int) []int {
tables := make(map[int]int) // 聲明一個空字典
for index, value := range nums {
// index爲地址,value爲nums[index]的值
tmp := target - value
fmt.Printf("index %d\tvalue %d\ttmp %d\n",index, value, tmp)
i, ok := tables[tmp]
fmt.Printf("tmp %d\ti %d\tok %v\n", tmp,i,ok)
if i, ok := tables[tmp]; ok {
return []int{i, index}
}
tables[value] = index
}
return []int{}
}
Python3
遍歷數組
def twoSum(self, nums, target):
for i in range(len(nums)-1):
for j in range(i+1,len(nums)):
if nums[i] + nums[j] == target:
return [i,j]
return None
一遍hash表
def twoSum(self, nums, target):
tables = {}
for index, num in enumerate(nums):
present_num = target - num
# present_num用於存儲目標元素的值
if present_num in tables:
return [tables[present_num], index]
tables[num] = index
return None
遍歷數組和一遍hash表的對比
遍歷數組的時間複雜度: O(n^2)
一遍hash表的時間複雜度: O(n)