木人的CS学习笔记

算法刷题打卡 & CS 学习笔记

打卡记录

代码随想录打卡第31天 | 56. 合并区间、738. 单调递增的数字、968. 监控二叉树

56. 合并区间 链接:56. 合并区间 文章:代码随想录 视频:B站讲解 状态:✅ 第一想法 区间判重,更新 end; 看完题解后的想法 – 实现中遇到的困难 – 代码 class Solution { public: vector<vector<int>> merge(vector<vector<int>>& intervals) { sort(intervals.begin(), intervals.end()); // 核心,先排序 int start = intervals[0][0]; int end = intervals[0][1]; vector<vector<int>> res; for (int i = 1; i < (int)intervals.size(); i++) { int left = intervals[i][0]; int right = intervals[i][1]; if (left <= end) { if (right > end) { end = right; } else { continue; } } else { res.push_back({start, end}); start = left; end = right; } } // 最后一组元素需要手动push res.push_back({start, end}); return res; } }; 738. 单调递增的数字 链接:738. 单调递增的数字 文章:代码随想录 视频:B站讲解 状态:⚠️ 第一想法 第一想法是拿个 vector 把数字都装起来,但是之后怎么做不明白; ...

April 3, 2026 · KahanaT800

代码随想录打卡第30天 | 452. 用最少数量的箭引爆气球、435. 无重叠区间、763. 划分字母区间

452. 用最少数量的箭引爆气球 链接:452. 用最少数量的箭引爆气球 文章:代码随想录 视频:B站讲解 状态:✅ 第一想法 不断地调整起点和终点范围,如果任意一边(其实是起点,排序之后有序)在范围内,就可以被引爆; 注意如果终点也在范围内就要调整终点位置; 看完题解后的想法 – 实现中遇到的困难 – 代码 class Solution { public: int findMinArrowShots(vector<vector<int>>& points) { sort(points.begin(), points.end()); int sum = 1; int start = points[0][0]; int end = points[0][1]; for (int i = 1; i < points.size(); i++) { if (points[i][0] <= end) { start = points[i][0]; if (points[i][1] <= end) { end = points[i][1]; } } else { start = points[i][0]; end = points[i][1]; sum++; } } return sum; } }; 435. 无重叠区间 链接:435. 无重叠区间 文章:代码随想录 视频:B站讲解 状态:✅ 第一想法 跟 LC452 挺像的; ...

April 2, 2026 · KahanaT800

代码随想录打卡第29天 | 134. 加油站、135. 分发糖果、860. 柠檬水找零、406. 根据身高重建队列

134. 加油站 链接:134. 加油站 文章:代码随想录 视频:B站讲解 状态:❌ 第一想法 没想出来; 看完题解后的想法 很巧妙,其实是思维盲区; 既然总油量大于等于总消耗有解,那么只要找到开始盈余的部分,这样剩下的油总能够支持消耗; 这里很巧妙,因为如果总量只要是大于等于,那不管前面亏了多少,后面一定剩了多少,只要不断舍去亏损的位置就行了; 和 LC53 是一个思想; 实现中遇到的困难 – 代码 class Solution { public: int canCompleteCircuit(vector<int>& gas, vector<int>& cost) { int totalDiff = 0; int curDiff = 0; int start = 0; // 1. 如果总油量小于总消耗,不可能跑完 // 2. 既然总油量大于等于总消耗有解,那么就要找到开始盈余的部分,这样才能支撑跑完全程 for (int i = 0; i < gas.size(); i++) { totalDiff += gas[i] - cost[i]; curDiff += gas[i] - cost[i]; if (curDiff < 0) { start = i + 1; curDiff = 0; } } return totalDiff >= 0 ? start : -1; } }; 135. 分发糖果 链接:135. 分发糖果 文章:代码随想录 视频:B站讲解 状态:❌ 第一想法 没啥思路; ...

April 1, 2026 · KahanaT800

算法笔记

原地哈希——把数组本身当哈希表

LC41 要求 O(n) 时间 O(1) 空间找第一个缺失正整数,常规哈希表空间不够用。原地哈希的核心思路:数组本身就是一张哈希表,把每个数送回它该在的位置。

March 24, 2026 · KahanaT800

接雨水——五种解法,把每一步都想通

接雨水最难的不是写代码,而是证明双指针为什么对。本文用「历史轨迹」论证把双指针的正确性彻底钉死,再用单调栈换一个视角重新理解。

March 19, 2026 · KahanaT800

Morris 遍历——不用栈也能遍历二叉树

递归和栈都需要 O(h) 额外空间。Morris 遍历通过临时修改树结构,用 O(1) 空间完成前中后序遍历。每一步都画图讲清楚。

March 16, 2026 · KahanaT800

OS 八股深入

从「一切皆文件」到 IO 多路复用——fd 到底是什么,IO 到底在干什么

背八股背到 epoll,却发现连 fd 和 IO 是什么都说不清。这篇从 Unix 的文件抽象出发,一步步讲到阻塞 IO 的困境,再到 select/poll/epoll 的设计与内核实现。

March 12, 2026 · KahanaT800

操作系统到底在干什么——从加电到进程通信的完整图景

从加电开始,一步步建立对操作系统本质的认识:内核不是一个运行中的程序,而是被无数次触发执行拼出来的基础设施。

March 10, 2026 · KahanaT800