分享
  1. 首页
  2. 文章

leecode two sum golang解析

hades · · 2400 次点击 · · 开始浏览
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

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 main
import (
 "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 main
import (
 "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 []Num
func (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())
}

有疑问加站长微信联系(非本文作者)

本文来自:Segmentfault

感谢作者:hades

查看原文:leecode two sum golang解析

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

关注微信
2400 次点击
暂无回复
添加一条新回复 (您需要 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传

用户登录

没有账号?注册
(追記) (追記ここまで)

今日阅读排行

    加载中
(追記) (追記ここまで)

一周阅读排行

    加载中

关注我

  • 扫码关注领全套学习资料 关注微信公众号
  • 加入 QQ 群:
    • 192706294(已满)
    • 731990104(已满)
    • 798786647(已满)
    • 729884609(已满)
    • 977810755(已满)
    • 815126783(已满)
    • 812540095(已满)
    • 1006366459(已满)
    • 692541889

  • 关注微信公众号
  • 加入微信群:liuxiaoyan-s,备注入群
  • 也欢迎加入知识星球 Go粉丝们(免费)

给该专栏投稿 写篇新文章

每篇文章有总共有 5 次投稿机会

收入到我管理的专栏 新建专栏