每日一题 --- 两数之和[力扣][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
}
相关推荐
不正经学生37 分钟前
C语言预处理详解:编译器真正动手之前的那些事
c语言·开发语言·算法·面试·bug
毕竟是shy哥3 小时前
计算YOLO数据集中每个类的目标数
算法·yolo·机器学习
M78佐菲3 小时前
Linux学习笔记:TCP协议
linux·笔记·学习·tcp/ip·算法
圣保罗的大教堂4 小时前
leetcode 1406. 石子游戏 III 困难
leetcode
晊晌_h5 小时前
嵌入式从0到精通——数据结构总结[特殊字符]
数据结构·算法·排序算法
我找到地球的支点啦5 小时前
Matlab系列(009) 一CRC循环冗余校验详解
开发语言·数据结构·算法·matlab·信息与通信
罗西的思考5 小时前
【OpenClaw具身硬件】ZeroClaw 源码阅读笔记(3)--- RAG
人工智能·算法·机器学习
浪里镖客6 小时前
位姿转换矩阵写法-个人习惯(计算机理解其实是相反的)
线性代数·算法·矩阵
小白羊丨9 小时前
如何诊断 Prompt 模板导致的效果下降?
人工智能·算法·prompt
OPEN-F10 小时前
C++11/14新特性精讲:移动语义与智能指针实战
开发语言·c++·算法