LeetCode 热题 HOT100(一):哈希表与双指针入门(Go 实现)

🥰个人主页:会编程的土豆(欢迎来访)

💎作者简介:后端学习者

❄️个人专栏:数据结构与算法数据库leetcode

那些你一个人走过的夜路,终将化作照亮未 来的光

本文覆盖力扣「热题 100」学习计划前 5 题,全部使用 Go 实现。适合作为刷题笔记直接收藏。

题单入口:LeetCode 热题 100


1. 两数之和

难度: 简单

标签: 数组、哈希表

题目链接: 1. 两数之和

题目描述

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

你可以假设每种输入只会对应一个答案,并且你不能使用两次相同的元素。可以按任意顺序返回答案。

示例:

复制代码
输入:nums = [2,7,11,15], target = 9
输出:[0,1]
解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1]

思路分析

暴力枚举两层循环是 O(n²)。更好的做法是用 哈希表

  • 遍历到 nums[i] 时,在哈希表中查找是否存在 target - nums[i]
  • 若存在,直接返回两个下标
  • 若不存在,把 nums[i] 和下标 i 放入哈希表

只遍历一次数组,时间复杂度 O(n)。

Go 代码

复制代码
func twoSum(nums []int, target int) []int {
	indexMap := make(map[int]int)
	for i, num := range nums {
		if j, ok := indexMap[target-num]; ok {
			return []int{j, i}
		}
		indexMap[num] = i
	}
	return nil
}

复杂度

  • 时间复杂度:O(n)
  • 空间复杂度:O(n)

49. 字母异位词分组

难度: 中等

标签: 数组、哈希表、字符串、排序

题目链接: 49. 字母异位词分组

题目描述

给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。

字母异位词是由重新排列源单词的所有字母得到的一个新单词。

示例:

复制代码
输入: strs = ["eat","tea","tan","ate","nat","bat"]
输出: [["bat"],["nat","tan"],["ate","eat","tea"]]

思路分析

字母异位词排序后会得到相同字符串,因此:

  1. 对每个字符串排序,得到 key
  2. map[string][]string 把相同 key 的原串归到同一组

也可以用长度为 26 的字符计数数组作为 key,避免排序,这里用排序写法更直观。

Go 代码

复制代码
func groupAnagrams(strs []string) [][]string {
	groups := make(map[string][]string)
	for _, s := range strs {
		b := []byte(s)
		sort.Slice(b, func(i, j int) bool {
			return b[i] < b[j]
		})
		key := string(b)
		groups[key] = append(groups[key], s)
	}

	res := make([][]string, 0, len(groups))
	for _, g := range groups {
		res = append(res, g)
	}
	return res
}

记得导入:import "sort"

复杂度

  • 时间复杂度:O(n · k log k),n 为字符串个数,k 为字符串平均长度
  • 空间复杂度:O(n · k)

128. 最长连续序列

难度: 中等

标签: 并查集、数组、哈希表

题目链接: 128. 最长连续序列

题目描述

给定一个未排序的整数数组 nums,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。

请你设计并实现时间复杂度为 O(n) 的算法解决此问题。

示例:

复制代码
输入:nums = [100,4,200,1,3,2]
输出:4
解释:最长数字连续序列是 [1, 2, 3, 4]。它的长度为 4。

思路分析

若先排序再扫一遍是 O(n log n)。要达到 O(n):

  1. 把所有数字放进哈希集合
  2. 只从「序列起点」开始数:若 x-1 不在集合中,说明 x 是起点
  3. x 开始不断查 x+1, x+2, ...,统计长度并更新答案

每个数字最多被访问常数次,整体仍是 O(n)。

Go 代码

复制代码
func longestConsecutive(nums []int) int {
	set := make(map[int]struct{}, len(nums))
	for _, num := range nums {
		set[num] = struct{}{}
	}

	longest := 0
	for num := range set {
		// 不是起点则跳过
		if _, ok := set[num-1]; ok {
			continue
		}
		cur := num
		length := 1
		for {
			if _, ok := set[cur+1]; !ok {
				break
			}
			cur++
			length++
		}
		if length > longest {
			longest = length
		}
	}
	return longest
}

复杂度

  • 时间复杂度:O(n)
  • 空间复杂度:O(n)

283. 移动零

难度: 简单

标签: 数组、双指针

题目链接: 283. 移动零

题目描述

给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。

请注意,必须在不复制数组的情况下原地对数组进行操作。

示例:

复制代码
输入: nums = [0,1,0,3,12]
输出: [1,3,12,0,0]

思路分析

使用快慢双指针:

  • slow 指向下一个非零元素应放的位置
  • fast 遍历整个数组
  • 遇到非零就与 nums[slow] 交换,然后 slow++

这样非零元素相对顺序不变,零自然被挤到后面。

Go 代码

复制代码
func moveZeroes(nums []int) {
	slow := 0
	for fast := 0; fast < len(nums); fast++ {
		if nums[fast] != 0 {
			nums[slow], nums[fast] = nums[fast], nums[slow]
			slow++
		}
	}
}

复杂度

  • 时间复杂度:O(n)
  • 空间复杂度:O(1)

11. 盛最多水的容器

难度: 中等

标签: 贪心、数组、双指针

题目链接: 11. 盛最多水的容器

题目描述

给定一个长度为 n 的整数数组 height。有 n 条垂线,第 i 条线的两个端点是 (i, 0)(i, height[i])

找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。返回容器可以储存的最大水量。

示例:

复制代码
输入:[1,8,6,2,5,4,8,3,7]
输出:49

思路分析

左右双指针从两端向中间夹逼:

  • 当前面积 = min(height[left], height[right]) * (right - left)
  • 每次移动 较矮 的那一侧:因为宽度一定变小,只有变高才可能让面积更大

这样可以把 O(n²) 暴力降到 O(n)。

Go 代码

复制代码
func maxArea(height []int) int {
	left, right := 0, len(height)-1
	maxWater := 0
	for left < right {
		h := height[left]
		if height[right] < h {
			h = height[right]
		}
		area := h * (right - left)
		if area > maxWater {
			maxWater = area
		}
		if height[left] < height[right] {
			left++
		} else {
			right--
		}
	}
	return maxWater
}

复杂度

  • 时间复杂度:O(n)
  • 空间复杂度:O(1)

小结

题目 核心技巧 时间复杂度
两数之和 哈希表一次遍历 O(n)
字母异位词分组 排序后的串作 key O(n·k log k)
最长连续序列 Set + 只从起点扩展 O(n)
移动零 快慢双指针 O(n)
盛最多水的容器 左右指针夹逼 O(n)

下一篇会继续写 三数之和、接雨水、无重复字符的最长子串、找到所有字母异位词、和为 K 的子数组,同样全部用 Go 实现。

如果这篇对你有帮助,欢迎点赞收藏,一起把 Hot100 刷完!

相关推荐
学习中.........1 小时前
并行 BPE 训练 与 手写 `Tokenizer`
人工智能·算法·机器学习·语言模型
科学实验家1 小时前
动态规划2
算法·动态规划
糖果店的幽灵11 小时前
人已经用 WorkBuddy 找工作拿了面试,你还在一份份手工改简历
人工智能·面试·职场和发展·langgraph
imuliuliang11 小时前
关于数据结构在算法设计中的核心作用解析7
算法
2401_8949155312 小时前
GEO 搜索优化完整源码从零部署:环境配置、集群搭建全流程
开发语言·python·tcp/ip·算法·unity
普通网友14 小时前
共识算法实现:从工作量证明到权益证明的演进
算法·区块链·共识算法
ldmd28415 小时前
地图生成算法(噪声篇-Perlin,Simplex,Value noise)
算法·go·地图生成