每日一题 --- 两数之和[力扣][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
}
相关推荐
WolfGang00732110 分钟前
代码随想录算法训练营Day50 | 拓扑排序、dijkstra(朴素版)
数据结构·算法
业精于勤的牙23 分钟前
浅谈:算法中的斐波那契数(四)
算法
一直都在57227 分钟前
数据结构入门:二叉排序树的删除算法
数据结构·算法
白云千载尽29 分钟前
ego_planner算法的仿真环境(主要是ros)-算法的解耦实现.
算法·无人机·规划算法·后端优化·ego·ego_planner
Swizard1 小时前
别再只会算直线距离了!用“马氏距离”揪出那个伪装的数据“卧底”
python·算法·ai
flashlight_hi1 小时前
LeetCode 分类刷题:199. 二叉树的右视图
javascript·算法·leetcode
LYFlied1 小时前
【每日算法】LeetCode 46. 全排列
前端·算法·leetcode·面试·职场和发展
2301_823438021 小时前
【无标题】解析《采用非对称自玩实现强健多机器人群集的深度强化学习方法》
数据库·人工智能·算法
小信啊啊1 小时前
Go语言数组与切片的区别
开发语言·后端·golang
oscar9991 小时前
CSP-J教程——第二阶段第十二、十三课:排序与查找算法
数据结构·算法·排序算法