继续推进,今天的题目明显开始有“味道”了:
一个是经典滑动窗口(字符串),一个是 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

💡 思路总结

这题的关键不是“求中位数”,而是:

👉 找到一个切分点,把两个数组划成左右两半

满足:

左边最大值 <= 右边最小值

⚡ 核心思想

  • 短数组上二分
  • ij 表示两个数组的切分位置
  • 保证左边总元素数量正确

💻 代码实现

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 天