這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
Leetcode上的two sum演算法用golang實現
two sum問題 :
Given nums = [2, 7, 11, 15], target = 9,Because nums[0] + nums[1] = 2 + 7 = 9,return [0, 1].
解題一
一般思路:
package mainimport ( "fmt")func twoSum(nums []int, target int) []int { for i, v1 := range nums { if i+1 != len(nums) { for j, v2 := range nums[i+1:] { if target == (v1 + v2) { return []int{i, i + j + 1} } } } } return []int{}}func main() { nums := []int{2, 7, 11, 15} fmt.Println(nums[0:]) target := 9 output := twoSum(nums, target) fmt.Println(output)}
解題二
多種思路解 :
package mainimport ( "sort" "fmt" "sync")var ( nums = []int{2, 7, 11, 15} noSolu = []int{-1, -1} target = 26 wg sync.WaitGroup)type Num struct { num, index int}type Nums []Numfunc (slice Nums) Len() int { return len(slice)}func (slice Nums) Less(i, j int) bool { return slice[i].num < slice[j].num}func (slice Nums) Swap(i, j int) { slice[i], slice[j] = slice[j], slice[i]}// 普通暴力 O(N^2)func algo1() []int { size := len(nums) for i := 0; i < size; i++ { for j := i + 1; j < size; j++ { if nums[i] + nums[j] == target { return []int{i, j} } } } return noSolu}// O(N^2) 最佳化func algo2() []int { size := len(nums) mapped := make(Nums, size) for i, k := range nums { mapped[i] = Num{k, i} } sort.Sort(mapped) // 以上如果已經排好序則不需要 for i := 0; i < size; i++ { for j := i + 1; j < size && mapped[i].num + mapped[j].num <= target; j++ { if mapped[i].num + mapped[j].num == target { return []int{mapped[i].index, mapped[j].index} } } } return noSolu}// O(NlogN) 演算法func algo3() []int { size := len(nums) mapped := make(Nums, size) for i, k := range nums { mapped[i] = Num{k, i} } sort.Sort(mapped) // 以上如果已經排好序則不需要 for _, k := range mapped { ret := sort.Search(size, func(j int) bool { return mapped[j].num >= target - k.num }) if ret != size { return []int{k.index, mapped[ret].index} } } return noSolu}// O(1) 演算法(滑稽func algo4() (ret []int){ ret = noSolu size := len(nums) wg.Add((size - 1) * size / 2) for i := 0; i < size; i++ { for j := i + 1; j < size; j++ { go func(i, j int) { if nums[i] + nums[j] == target { ret = []int{i, j} } wg.Done() }(i, j) } } wg.Wait() return}func main() { fmt.Println(algo1()) fmt.Println(algo2()) fmt.Println(algo3()) fmt.Println(algo4())}