每日一题 --- 两数之和[力扣][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
}
相关推荐
语戚26 分钟前
力扣 968. 监控二叉树 —— 贪心 & 树形 DP 双解法递归 + 非递归全解(Java 实现)
java·算法·leetcode·贪心算法·动态规划·力扣·
skywalker_1129 分钟前
力扣hot100-7(接雨水),8(无重复字符的最长子串)
算法·leetcode·职场和发展
hrhcode1 小时前
【java工程师快速上手go】二.Go进阶特性
java·golang·go
bIo7lyA8v2 小时前
算法稳定性分析中的输入扰动建模的技术9
算法
CoderCodingNo2 小时前
【GESP】C++三级真题 luogu-B4499, [GESP202603 三级] 二进制回文串
数据结构·c++·算法
sinat_286945192 小时前
AI Coding 时代的 TDD:从理念到工程落地
人工智能·深度学习·算法·tdd
炽烈小老头2 小时前
【 每天学习一点算法 2026/04/12】x 的平方根
学习·算法
ASKED_20192 小时前
从排序到生成:腾讯广告算法大赛 2025 baseline解读
人工智能·算法
田梓燊2 小时前
leetcode 160
算法·leetcode·职场和发展