本題的鏈接:BM50 兩數之和
最初拿到這個題目首先想到的就是兩個指針,然後向後遍歷,於是寫出來的代碼也簡明易懂:
package main
/**
*
* @param numbers int整型一維數組
* @param target int整型
* @return int整型一維數組
*/
func twoSum(numbers []int, target int) []int {
// write code here
for i := 0; i < len(numbers)-1; i++ {
for j := i + 1; j < len(numbers); j++ {
if numbers[i]+numbers[j] == target {
return []int{i + 1, j + 1}
}
}
}
return []int{}
}
然而很不幸的是這個解法超時了。如果數組特別大,那麼這個解法顯然是不佔優勢的,時間複雜度明顯是O(n^2),而題目要求的時間複雜度是O(nlogn)。此時,如果引入一個map,則可以將對數組的遍歷降低成一趟,從而提升時間效率。
package main
/**
*
* @param numbers int整型一維數組
* @param target int整型
* @return int整型一維數組
*/
func twoSum(numbers []int, target int) []int {
// write code here
var m = make(map[int]int)
for i := 0; i < len(numbers); i++ {
v, ok := m[target-numbers[i]]
if ok {
return []int{v + 1, i + 1}
} else {
m[numbers[i]] = i
}
}
return []int{}
}
這樣一來,整個用例的測試時間不過62ms。時間複雜度也降低到了O(n)