426 字
2 分钟
一些零碎知识的补充
2026-03-07
无标签

时间复杂度#

题目给定的数据规模 n你应该瞄准的时间复杂度对应的常见算法或数据结构
n <= 20O(2^n) 或 O(n!)回溯法 (Backtracking)、状态压缩 DP
n <= 10^2O(n^3)动态规划 (3D DP)、Floyd 算法
n <= 10^3O(n^2)双层 for 循环、动态规划 (2D DP)
n <= 10^4 ~ 10^5O(n log n) 或 O(n)最常见! 排序、双指针、二分查找、哈希表、栈/队列
n <= 10^6O(n) 或 O(log n) 或 O(1)二分查找、数学解法、位运算

额外空间复杂度#

O(n) : 哈希表、辅助数组和栈和队列

**O(1):**不能去 new 一个同样大小的新数组或哈希表,只能用几个变量作为指针来回倒腾数据

在 Go 中,字符串是一个只读的字节切片[]byte),它不关心这些字节具体是什么编码。

(1) 通过索引访问#

s := "hello"
for i := 0; i < len(s); i++ {
b := s[i] // b 的类型是 byte(uint8)
fmt.Printf("%c ", b)
}

这种方式每次取一个字节,对于 ASCII 字符没问题,但如果字符串包含中文等 Unicode 字符,就会乱码。

(2) 使用 range 遍历#

s := "hello"
for i, r := range s { // r 的类型是 rune(int32)
fmt.Printf("%c ", r)
}

range 会自动将字节序列按 UTF-8 解码,每次迭代返回一个 rune(即 Unicode 码点,类型为 int32)

‘a’是rune类型

“a”是字符串类型

sort.Slice – 对任意切片自定义排序#

当你需要按某种规则排序(比如按绝对值、按结构体字段)时,sort.Slice 最常用。它通过你提供的 less 函数决定顺序。

// 按绝对值降序
nums := []int{-5, 2, -8, 3}
sort.Slice(nums, func(i, j int) bool {
return abs(nums[i]) > abs(nums[j]) // 降序
})
一些零碎知识的补充
https://sheep44044.github.io/posts/算法/一些零碎知识的补充/
作者
sheep44044
发布于
2026-03-07
许可协议
CC BY-NC-SA 4.0