package main
import (
"container/list"
"fmt"
)
type TreeNode struct {
Val int
Left *TreeNode
Right *TreeNode
}
func rightSideView(root *TreeNode) []int {
var res []int
if root == nil {
return res
}
queue := list.New()
queue.PushBack(root)
for queue.Len() > 0 {
levelSize := queue.Len()
for i := 0; i < levelSize; i++ {
node := queue.Remove(queue.Front()).(*TreeNode)
if i == levelSize-1 {
res = append(res, node.Val)
}
if node.Left != nil {
queue.PushBack(node.Left)
}
if node.Right != nil {
queue.PushBack(node.Right)
}
}
}
return res
}
复杂度:时间 O(n),空间 O(n);
边界:空树返回空,左子树存在时取最右侧节点。
2. 两数之和(哈希表 + 延伸)
基础实现(O(n))
go复制代码
func twoSum(nums []int, target int) []int {
numMap := make(map[int]int)
for i, num := range nums {
if idx, ok := numMap[target-num]; ok {
return []int{idx, i}
}
numMap[num] = i
}
return nil
}
延伸追问
问题
核心答案
为什么用哈希表
空间换时间,O(n) 对比暴力 O(n²),效率提升显著
千万级数据哈希表装得下吗
1000 万数据约 160MB,普通服务器可容纳;亿级需 1.6GB,内存紧张则需优化
内存放不下怎么办
分块落盘:拆分为 100 万/块,逐块用哈希表匹配,跨块记录索引
更高效方案
排序+双指针(O(nlogn),空间 O(1)),无需原索引时最优
多组解处理
哈希表存"值→索引列表",遍历收集所有匹配项
O(n) 优化空间
预分配哈希表容量、早停、重复值跳过
3. 子数组和为 K(前缀和 + 哈希表)
go复制代码
func subarraySum(nums []int, k int) bool {
prefixMap := make(map[int]bool)
prefixSum := 0
prefixMap[0] = true
for _, num := range nums {
prefixSum += num
if prefixMap[prefixSum-k] {
return true
}
prefixMap[prefixSum] = true
}
return false
}