【leetcode】两数之和 – Go 语言题解

导读:本篇文章讲解 【leetcode】两数之和 – Go 语言题解,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com


一、题目描述

给定一个整数数组 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) 的算法吗?


二、我的题解

1. 遍历法

func twoSum(nums []int, target int) []int {
	var result []int
	for i := 0; i < len(nums); i++ {
		for j := i + 1; j < len(nums); j++ {
			if nums[i]+nums[j] == target {
				result = []int{i, j}
			}
		}
	}
	return result
}

结果:
在这里插入图片描述
这种解法:

  • 时间复杂度:O(N2),其中 N 是数组中的元素数量。
  • 空间复杂度:O(1)。

2. 把题目稍微变一下

实际上,题目中 “假设每种输入只会对应一个答案” 是不符合实际情况的。

一般在一个数组中,其和为同一个数的两个数字有很多对,所以我把题目中函数的返回值类型改为了 [][]int,这样就能输出所有和为 target 的数字对了。

package main

import (
	"fmt"
)

func main() {
	nums := []int{0, 8, 2, 3, 6, 4}
	target := 6
	result := twoSum(nums, target)
	fmt.Println(result)
}

func twoSum(nums []int, target int) [][]int {

	result := [][]int{}
	for i := 0; i < len(nums); i++ {
		for j := i + 1; j < len(nums); j++ {
			if nums[i]+nums[j] == target {
				temp := []int{i, j}
				result = append(result, temp)
			}
		}
	}
	return result
}

三、别人更好的解法 – 哈希表

创建一个哈希表,对于每一个 x,我们首先查询哈希表中是否存在 target – x,然后将 x 插入到哈希表中,即可保证不会让 x 和自己匹配。

package main

import (
	"fmt"
)

func main() {
	nums := []int{7, 8, 2, 3, 6, 4}
	target := 12
	result := twoSum(nums, target)
	fmt.Println(result)
}

func twoSum(nums []int, target int) []int {
	//建一个空的哈希表
	hashTable := map[int]int{}

	//遍历nums
	for i, x := range nums {

		if p, ok := hashTable[target-x]; ok { //判断某个键是否存在,若存在就返回相应的值和true
			return []int{p, i}
		}
		//向哈希表里赋值
		hashTable[x] = i //将原nums的索引和值翻转,这样值就变成了键
		//哈希表赋值语句只能放在if后面,为了避免数组中的同一个元素重复出现

	}
	return nil
}

Go 语言中的哈希表是 map 数据结构。

执行结果:

在这里插入图片描述

这种解法用空间换时间,多建了一个数据结构(哈希表),迅速加快了查找时间:

  • 时间复杂度:O(N),其中 N 是数组中的元素数量。对于每一个元素 x,我们可以 O(1) 地寻找 target – x。

  • 空间复杂度:O(N),其中 N 是数组中的元素数量。主要为哈希表的开销。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由半码博客整理,本文链接:https://www.bmabk.com/index.php/post/118998.html

(0)
seven_的头像seven_bm

相关推荐

发表回复

登录后才能评论
半码博客——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!