每日一题 --- 两数之和[力扣][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
}
相关推荐
倒头就睡的小比特3 天前
算法竞赛C++常用的STL
c++·算法
小羊没烦恼!3 天前
初探性能优化——2个月到4小时的性能提升
java·开发语言·windows·算法·c#
ttwuai3 天前
Go开源后台管理系统推荐:怎么按技术栈和边界比较4个官方仓库?
golang·gin
猎头南楼3 天前
知识社区推荐系统实践:新用户冷启动与长短期兴趣建模的挑战 资深推荐算法工程师
人工智能·深度学习·算法·机器学习
codeejun3 天前
每日一Go·MySQL-5、锁机制全解析
云原生·golang
旖旎夜光3 天前
力控面试题 01.01: 判定字符是否唯一(位运算) —— 题解
c++·学习·算法·leetcode·力控
wzdark3 天前
大规模并行计算中的负载均衡算法研究4
算法
Because_of_Her13 天前
并查集-听课笔记
笔记·算法·并查集
码流子3 天前
高速公路安全监测实践:碰撞监测预警+物联网底座,从感知到处置的闭环
大数据·人工智能·物联网·算法·架构
another heaven3 天前
【算法/C++ MD5算法能否逆解码?原理、C++实现与同类哈希算法对比】
c++·算法·哈希算法