两数之和

两数之和

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

你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。

示例:

给定 nums = [2, 7, 11, 15], target = 9

因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]

解题

思路

哈希表
以空间换时间的方式,将数组以值、序号的形式存储在哈希字典中。
遍历数组,得到另一个值,检查哈希字典中是否有这个值。

  • 注意:因为可能会有重复的值,哈希字典的value值是[]int
代码
//两次循环的情况
func twoSum(nums []int, target int) []int {
	hashmap := make(map[int][]int)
	//第一次循环,存储数据到字典
	for k, v := range nums {
		hashmap[v] = append(hashmap[v], k)
	}
	
	result := make([]int, 0 ,2)
	//第二次循环,进行比较
	for k, v := range nums {
		compare := target - v
		otherSlice, ok := hashmap[compare]
		//ok也可以不必判断,range遍历空切片会退出
		//如果存在序号切片
		if  ok {
			//且不为原序号
			for _, hv := range otherSlice  {
				if k != hv {
					return append(result, k, hv)
				}
			}
		}
	}
	return nil
}

优化循环一次的情况

func twoSum1(nums []int, target int) []int {
	//哈希表
	hashmap := make(map[int][]int)
	//结果
	var result []int
	for k, v := range nums {
		//存入哈希字典
		hashmap[v] = append(hashmap[v], k)
		//进行比较
		compare := target - v
		otherSlice, ok := hashmap[compare]
		//如果存在值
		if  ok {
			//且不为原值
			for _, hv := range otherSlice  {
				if k != hv {
					return append(result, hv, k)
				}
			}
		}
	}
	return nil
}
发布了322 篇原创文章 · 获赞 165 · 访问量 7万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 技术黑板 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览