
继续推进,今天的题目明显开始有“味道”了:
一个是经典滑动窗口(字符串),一个是 Hard(二分 + 思维转换)。
👉 今天的关键词:窗口、边界、二分思想
🧠 LeetCode 3 – Longest Substring Without Repeating Characters
💡 思路总结
这题核心是:
👉 滑动窗口 + 去重
我们用两个指针维护一个窗口 [left, right]:
right不断向右扩展- 如果出现重复字符,就移动
left收缩窗口 - 始终保证窗口内字符不重复
⚡ 关键点
- 用数组
freq[128]记录字符出现次数 - 当出现重复时(freq > 1),不断移动左指针
- 每次更新最大长度
💻 代码实现
class Solution {
public:
int lengthOfLongestSubstring(string s) {
int freq[128] = {0}; // 记录字符出现次数
int left = 0;
int maxLen = 0;
for (int right = 0; right < s.size(); right++) {
freq[s[right]]++;
while (freq[s[right]] > 1) {
freq[s[left]]--;
left++;
}
maxLen = max(maxLen, right - left + 1);
}
return maxLen;
}
};
📌 知识点总结
1️⃣ 滑动窗口本质
- 维护一个“合法区间”
- 不满足条件就收缩左边
2️⃣ 模板思维
右指针扩展 → 不合法 → 左指针收缩 → 更新答案
3️⃣ 常见应用场景
- 无重复子串
- 最长/最短子数组
- K 个不同字符问题
👉 这题是滑动窗口的“入门模板题”,非常重要。
🔥 LeetCode 4 – Median of Two Sorted Arrays
💡 思路总结
这题的关键不是“求中位数”,而是:
👉 找到一个切分点,把两个数组划成左右两半
满足:
左边最大值 <= 右边最小值
⚡ 核心思想
- 在 短数组上二分
- 用
i和j表示两个数组的切分位置 - 保证左边总元素数量正确
💻 代码实现
class Solution {
public:
double findMedianSortedArrays(vector<int>& nums1, vector<int>& nums2) {
if (nums1.size() > nums2.size()) {
swap(nums1, nums2);
}
int m = nums1.size();
int n = nums2.size();
int left = 0, right = m;
while (left <= right) {
int i = (left + right) / 2;
int j = (m + n + 1) / 2 - i;
int nums1Left = (i == 0) ? INT_MIN : nums1[i - 1];
int nums1Right = (i == m) ? INT_MAX : nums1[i];
int nums2Left = (j == 0) ? INT_MIN : nums2[j - 1];
int nums2Right = (j == n) ? INT_MAX : nums2[j];
if (nums1Left <= nums2Right && nums2Left <= nums1Right) {
if ((m + n) % 2 == 1) {
return max(nums1Left, nums2Left);
} else {
return (max(nums1Left, nums2Left) + min(nums1Right, nums2Right)) / 2.0;
}
} else if (nums1Left > nums2Right) {
right = i - 1;
} else {
left = i + 1;
}
}
return 0.0;
}
};
📌 知识点总结
1️⃣ 思维转换(最重要)
- ❌ 不是合并数组
- ✅ 是“切分数组”
2️⃣ 二分的对象
- ❌ 不是数值
- ✅ 是“切分位置”
3️⃣ 四个关键变量
nums1Left / nums1Right
nums2Left / nums2Right
👉 本质就是在比较“切口左右”
4️⃣ 模板总结
1. 在短数组上二分
2. 计算另一数组切分点
3. 判断是否合法
4. 不合法就调整切分位置
🧩 今日总结
| 题目 | 核心思想 |
|---|---|
| LeetCode 3 | 滑动窗口 |
| LeetCode 4 | 二分 + 切分思想 |
🧠 今日收获
今天其实很关键:
- 你掌握了 滑动窗口模板
- 你接触了 Hard 级别的二分思想
这两种思维,在后面会反复出现。
💬 写给自己的话
Day 2,比 Day 1 更难,但你已经扛住了。
很多人刷题会卡在这里:
- 一看 Hard 就放弃
- 一看复杂逻辑就跳过
但你没有。
这说明一件事:
你不是在刷题,你是在打基础。
继续坚持:
- 今天理解一点点
- 明天熟练一点点
- 后天形成直觉
🚀 有一天你会回头看这题,然后笑出来:
“就这?”
继续冲,阿玉。
—— 刷题第 2 天
