每日题单 · 2026-09-23

用法

每题先自己写 25 分钟(时间盒),卡住就找我要档位提示;做完把 [x] 勾上。 复盘题不写新笔记,直接在原文出处下方追加「二刷日期 + 一句话卡点」。

🆕 新题(codetop 前端岗频率榜)

题目难度频率状态
补充题4. 手撕快速排序中等29🆕
215. 数组中的第K个最大元素中等29🔁(已刷过,重做)

🔁 复盘(vault 轮换池)

题目难度频率备注
数据流的中位数困难1复盘 · 出处:GRD 堆
合并 K 个升序链表——复盘 · 出处:GRD 堆

完成打卡

/**
 * 快速排序(Hoare 双指针对撞分区 + 随机基准防退化)
 * @param {number[]} nums
 * @return {number[]}
 */
var sortArray = function(nums) {
    function quickSort(l, r) {
        if (l >= r) return;
        const pivot = nums[Math.floor(Math.random() * (r - l + 1)) + l];
        let i = l, j = r;
        while (i <= j) {
            while (nums[i] < pivot) i++;
            while (nums[j] > pivot) j--;
            if (i <= j) {
                [nums[i], nums[j]] = [nums[j], nums[i]];
                i++;
                j--;
            }
        }
        quickSort(l, j);
        quickSort(i, r);
    }
    quickSort(0, nums.length - 1);
    return nums;
};
/**
 * 快速选择 QuickSelect(Hoare 双指针分区 + 随机基准 + 门神定位法)
 * @param {number[]} nums
 * @param {number} k
 * @return {number}
 */
var findKthLargest = function(nums, k) {
    const target = nums.length - k;
 
    const qs = (l, r) => {
        if (l >= r) return nums[target];
 
        const randomIndex = Math.floor(Math.random() * (r - l + 1)) + l;
        const pivot = nums[randomIndex];
 
        let i = l, j = r;
        while (i <= j) {
            while (nums[i] < pivot) i++;
            while (nums[j] > pivot) j--;
            if (i <= j) {
                [nums[i], nums[j]] = [nums[j], nums[i]];
                i++;
                j--;
            }
        }
 
        // 门神法则:入左院、进右院、夹中间直取果
        if (target <= j) return qs(l, j);
        if (target >= i) return qs(i, r);
        return nums[target];
    };
 
    return qs(0, nums.length - 1);
};
  • 复盘 1
  • 复盘 2