力扣题解合集(按日期汇总)
说明:本文整合 source/_posts 目录下带日期的力扣题解,按时间顺序汇总,保留原文内容与代码。
2023-3-20 · 3 无重复字符的最长子串
无重复字符的最长子串
给定一个字符串 s ,找出其中不含有重复字符的最长子串的长度。
示例 1:
1 | 输入: s = "abcabcbb" |
示例 2:
1 | 输入: s = "bbbbb" |
示例 3:
1 | 输入: s = "pwwkew" |
思路: 利用滑动窗口,两个指针 right 和 left 作为窗口左右边界。右边逐渐扩大,利用 map 统计字符次数,若次数大于 1 说明重复,再收缩左边直到窗口无重复,窗口大小即答案。
1 | class Solution { |
为什么要用 unordered_map:
unordered_map查询单个 key 时效率比map高,查询范围时比map低。
内部实现机理:
- map:红黑树,有序;效率由树操作决定。
- unordered_map:哈希表,元素无序。
2023-3-20 · 997 有序数组的平方
997 有序数组的平方
给你一个按非递减顺序排序的整数数组 nums,返回每个数字平方组成的新数组,要求也按非递减顺序排序。
示例 1:
1 | 输入:nums = [-4,-1,0,3,10] |
示例 2:
1 | 输入:nums = [-7,-3,2,3,11] |
方法:首尾双指针,绝对值大的在两侧。比较平方大的放入结果数组尾部,移动对应指针,直到头指针大于尾指针。
第一遍没过:截至条件写成 >= 导致漏掉中间数字。
1 | class Solution { |
双指针也可先找到负数/正数分界线,复杂度相同。
2023-3-21 · 7 整数反转
7 整数反转
给你一个 32 位有符号整数 x,返回数字部分反转后的结果;若溢出 [−2^31, 2^31−1] 返回 0。假设环境不允许存储 64 位整数。
示例 1: x = 123 -> 321
示例 2: x = -123 -> -321
示例 3: x = 120 -> 21
示例 4: x = 0 -> 0
思路: 取余获得末位,res = res*10 + rem,同时缩小 x/=10,每次检查溢出。
1 | class Solution { |
1 | table Title,Status,file.tags as Tags |
2023-3-25 · 盛最多水的容器
11. 盛最多水的容器
给定整数数组 height,找两条线与 x 轴组成的容器最大水量。不能倾斜容器。
方法一:暴力遍历(超时)。
1 | class Solution { |
双指针解法:left 从头,right 从尾,面积 min(height[left], height[right]) * (right - left),移动较低的一边以期增大面积。
1 | class Solution { |
2023-4-1 · 1008 前序遍历构造二叉搜索树
1008. 前序遍历构造二叉搜索树
给定整数数组(BST 的先序遍历),构造树并返回根。保证有解。BST 满足左子树 < 根 < 右子树。
思路:先序第一个是根,根据根值划分左右子树,递归构建;idx==p.size() 截至。null 节点不增加 idx。
1 | /** |
2023-4-5 · 两整数之和
两整数之和
不使用 + -,计算 a 和 b 之和。
思路:无进位加法 a ^ b;进位 a & b << 1,循环直到进位为 0。
1 | class Solution { |
进位示例
- a = 0101
- b = 0100
- carry = 0100 << 1 = 1000
- a = 0001, b = 1000
- carry = 0000 << 1 = 0000
- a = 1001, b = 0000 输出 1001
2023-4-5 · 82 删除排序链表中的重复元素 II
82. 删除排序链表中的重复元素 II
删除排序链表中所有重复数字,仅保留不同数字。
递归写法:
1 | /** |
如果链表为空或单元素,直接返回。若当前值不同于下一个,递归处理后续;若相同则跳过所有相同值再递归。
迭代写法(哑节点):
1 | class Solution { |
一次遍历,cur/cur->next/cur->next->next 三指针,遇重复跳过所有重复值。
2023-4-15 · 动态规划
动态规划专题 — 322 零钱兑换
给你 k 种面值 c1..ck 的硬币(数量无限)和总金额 amount,求最少硬币数;不可达返回 -1。
如何正确列出状态转移:
- base:amount=0 返回 0。
- 状态:amount。
- 选择:硬币面值。
- 定义:
dp(amount)为凑出金额的最少硬币数。
朴素递归(指数级):
1 | int dp(vector<int>& coins, int amount); |
2. 带备忘录的递归
消除冗余:子问题总数 O(n),时间 O(kn)。
1 | class Solution { |
3. dp 数组迭代方法
自底向上,dp[i] 表示金额 i 最少硬币数。
1 | // 注意:cpp 代码由 chatGPT🤖 根据我的 java 代码翻译,旨在帮助不同背景的读者理解算法逻辑。 |

2023-4-30 · C++ 常用的函数
常用的函数
无序集合:
1 | unordered_set<int> visited; |
vector:
1 | vector<int> IN(N+10001); // 初始化大小为 N+10001 的全 0 列表 |
哈希表:
1 |
|
C++ 二分查找的函数
Lower_bound() 函数
find/find_if 顺序查找,lower_bound/upper_bound/equal_range 二分查找。
语法:
1 | // 在 [first, last) 区域内查找不小于 val 的元素 |
lower_bound 底层实现
1 | template <class ForwardIterator, class T> |
适用于已排好序的序列(不要求全局升降序,只需满足小于 val 的在前)。
upper_bound() 函数
类似 lower_bound,同样要求序列满足上面“已排好序”。
equal_range() 函数
1 | // 找到 [first, last) 范围中所有等于 val 的元素 |
2023-6-4 · 75 颜色分类
颜色分类
给定 n 个元素数组 nums,值为 0/1/2,原地排序为红白蓝(0/1/2)。不能用库 sort。
思路: 一次遍历把 0 插头、2 插尾;数组移动耗时,可用链表。或单指针两次遍历:先放 0 到头,再放 1 到头(从非零处开始)。
1 | class Solution { |
复杂度:时间 O(n),空间 O(1)。
方法二:双指针
两个指针 p0/p1 分别交换 0 和 1,一次遍历。
1 | class Solution { |
2023-6-5 · 设计哈希映射
设计哈希映射
不使用内建哈希表,设计 MyHashMap:put/get/remove。
优化小 tips:emplace_back 代替 push_back(make_pair(...))。
1 | class MyHashMap { |
2023-6-7 · 48 旋转图像
旋转图像
给定 n×n 矩阵 matrix,原地顺时针旋转 90 度。不能使用额外矩阵。
思路: 先按主对角线翻转,再反转每行;逆时针则按副对角线翻转再反转每行。
1 | class Solution { |
2023-6-10 · 59 螺旋矩阵
59 螺旋矩阵
给你正整数 n,生成 1..n^2 顺时针螺旋的 n x n 矩阵。
解题思路: 按上/右/下/左界收缩螺旋填充,num<=n*n。
1 | class Solution { |

谢谢你请我吃糖果。
- 本文作者: Wynne Yin
- 本文链接: https://wynneyin.github.io/2025/11/18/力扣题解合集(日期版)/
- 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!
