算法刷题笔记

LeetCode 刷题记录

按题型分类的 LeetCode 刷题笔记,包含高频面试题和思路总结

已完成题单

11512244112120166242342112816792192260200128153623236438053371

枚举

2001. 可互换矩形的组数

用一个下标从 0 开始的二维整数数组 rectangles 来表示 n 个矩形,其中 rectangles[i] = [widthi, heighti] 表示第 i 个矩形的宽度和高度。

如果两个矩形 iji < j)的宽高比相同,则认为这两个矩形 可互换

问题

计算并返回 rectangles 中有多少对 可互换 矩形。

解题思路

将宽高比化简为最简分数,用哈希表统计最简分数的个数。若存在 m 个宽高比相同的矩形,则可互换的矩形对有 m * (m-1) / 2 个。

参考代码

用到的数据结构:cnt := map[[2]int]int64{}

// 如何化简?求 gcd
for a != 0 {
  a, b = b%a, a
}
gcd -> b

3623. 统计梯形的数目 I

给你一个二维整数数组 points,其中 points[i] = [xi, yi] 表示第 i 个点在笛卡尔平面上的坐标。

水平梯形 是一种凸四边形,具有 至少一对 水平边(即平行于 x 轴的边)。

问题

返回可以从 points 中任意选择四个不同点组成的 水平梯形 数量。答案对 10^9 + 7 取余。

解题思路

1. 统计每一行的节点数
2. 从每一行中选出 2 个节点作为水平边
3. 枚举每一行,设该行有 k = c * (c-1) / 2 条水平边,s 为之前遍历过的行的边数,则一共可以组成 s * k 个水平梯形。

参考代码

func countTrapezoids(points [][]int) (ans int) {
    const mod = 1_000_000_007
    cnt := make(map[int]int, len(points))
    for _, p := range points {
        cnt[p[1]]++
    }

    s := 0
    for _, c := range cnt {
        k := c * (c - 1) / 2
        ans += s * k
        s += k
    }
    return ans % mod
}

3371. 识别数组中的最大异常值

给你一个整数数组 nums,其中恰好存在一个异常值。异常值是指在数组中出现次数与其他所有数都不同的值。

问题

返回 nums 中的异常值。若不存在则返回 -1。

解题思路

设异常值为 x,元素和为 y。根据题意:x + 2y = sum(nums)
问题变为从 nums 中选出两个下标不同的数 xy,求满足条件的最大 x

参考代码

func getLargestOutlier(nums []int) int {
    cnt := map[int]int{}
    sum := 0
    for _, x := range nums {
        cnt[x]++
        sum += x
    }

    ans := math.MinInt
    for _, x := range nums {
        cnt[x]--
        if (sum-x)%2 == 0 && cnt[(sum-x)/2] > 0 {
            ans = max(ans, x)
        }
        cnt[x]++
    }
    return ans
}

更多题目整理中...

代码不是结论,更像我理解世界时留下的草稿。

© 2026 Coder回忆录

继续写、继续做、继续整理,直到它们慢慢变成自己的结构。