每日一题 --- 两数之和[力扣][Go]

两数之和

题目:1. 两数之和

给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。

你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。

你可以按任意顺序返回答案。

示例 1:

复制代码
输入:nums = [2,7,11,15], target = 9
输出:[0,1]
解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。

示例 2:

复制代码
输入:nums = [3,2,4], target = 6
输出:[1,2]

示例 3:

复制代码
输入:nums = [3,3], target = 6
输出:[0,1]

提示:

  • 2 <= nums.length <= 104
  • -109 <= nums[i] <= 109
  • -109 <= target <= 109
  • 只会存在一个有效答案

**进阶:**你可以想出一个时间复杂度小于 O(n2) 的算法吗?

方法一:

使用二元组,解决问题。

go 复制代码
type eryuanzu struct {
	Index int
	Value int
}

func twoSum(nums []int, target int) []int {
	Len := len(nums)
	res := make([]int, 2)
	eryuanzus := make([]*eryuanzu, Len)
	// m 排序
	for i := 0; i < Len; i++ {
		eryuanzus[i] = &eryuanzu{Index: i, Value: nums[i]}
	}
	for _, e := range eryuanzus {
		fmt.Println(e.Index, e.Value)
	}
	// 给二元组排序
	qSortForEryuanzu(eryuanzus, 0, Len-1)
	for _, e := range eryuanzus {
		fmt.Println(e.Index, e.Value)
	}
	l, r := 0, Len-1
	for l < r {
		if eryuanzus[l].Value+eryuanzus[r].Value < target {
			l++
		} else if eryuanzus[l].Value+eryuanzus[r].Value > target {
			r--
		} else {
			res[0] = eryuanzus[l].Index
			res[1] = eryuanzus[r].Index
			return res
		}
	}
	return res
}

func qSortForEryuanzu(es []*eryuanzu, s, h int) {
	if s >= h {
		return
	}
	pos := positionForEryuanzu(es, s, h)
	qSortForEryuanzu(es, s, pos-1)
	qSortForEryuanzu(es, pos+1, h)
}

func positionForEryuanzu(es []*eryuanzu, s, h int) int {
	base := es[s]
	l, r := s, h
	for l < r {
		for l < r && es[r].Value >= base.Value {
			r--
		}
		es[l] = es[r]

		for l < r && es[l].Value <= base.Value {
			l++
		}
		es[r] = es[l]
	}
	es[l] = base
	return l
}

使用快排时间复杂度O(nlogn)。空间复杂度消耗较大O(n)。

时间复杂度是符合进阶要求了,是否还有更快的方法呢?

我们如果遍历数组,只需要知道当前遍历的元素有没有与之相加为target的数。那么我们就可以用哈希表来完成。

方法二:

使用哈希表。

go 复制代码
func twoSum(nums []int, target int) []int {
	m := make(map[int]int)
	for i, num := range nums {
		m[num] = i
	}
	for i, num := range nums {
		if j, ok := m[target-num]; ok {
			if i != j {
				return []int{i, j}
			}
		}
	}
	return nil
}
相关推荐
未来之窗软件服务5 小时前
自己写算法(九)网页数字动画函数——东方仙盟化神期
前端·javascript·算法·仙盟创梦ide·东方仙盟·东方仙盟算法
豐儀麟阁贵5 小时前
基本数据类型
java·算法
乐迪信息7 小时前
乐迪信息:基于AI算法的煤矿作业人员安全规范智能监测与预警系统
大数据·人工智能·算法·安全·视觉检测·推荐算法
hsjkdhs8 小时前
C++之多层继承、多源继承、菱形继承
开发语言·c++·算法
立志成为大牛的小牛8 小时前
数据结构——十七、线索二叉树找前驱与后继(王道408)
数据结构·笔记·学习·程序人生·考研·算法
星空下的曙光8 小时前
Node.js crypto模块所有 API 详解 + 常用 API + 使用场景
算法·node.js·哈希算法
poemyang9 小时前
Goroutine间的“灵魂管道”:Channel如何实现数据同步与因果传递?
golang·并发编程
Lazy龙10 小时前
Golang协程
golang
StarPrayers.10 小时前
旅行商问题(TSP)(2)(heuristics.py)(TSP 的两种贪心启发式算法实现)
前端·人工智能·python·算法·pycharm·启发式算法
爱吃橘的橘猫10 小时前
嵌入式系统与嵌入式 C 语言(2)
c语言·算法·嵌入式