实验元数据 (Meta Data)
用于日后检索和归档,建立知识索引。
实验编号/标题:实验-leetcode-84-数组中的第 K 个最大元素
日期:Feb 27, 2026
所属领域/标签:例如:#LeetCode
🎯 实验前:假设与目标 (Plan)
不要在此处长篇大论,用一两句话厘清“为什么做这个”。
当前问题 (Problem):我现在遇到了什么阻碍?或者我想解决什么问题?
实验目标 (Objective):做完这件事,我想达到什么具体效果?
核心假设 (Hypothesis):(最关键的一步) 我认为怎么做能成功?
维护一个容量为 k 的最小堆即可。
🧪 实验中:执行步骤与变量 (Do)
记录“我到底做了什么”。如果是代码,粘贴关键片段;如果是实物操作,记录参数。
准备工作/工具:
List tools or resources used.
控制变量 (Variable):
不变的量:(例:目标网址、抓取频率)
改变的量 (测试点):(例:User-Agent 字符串,IP代理池)
执行步骤 (Log):
Step 1 定义小根堆
| |
Step 2 向小根堆增加元素
| |
👁️ 实验后:现象与数据 (Check)
客观记录发生了什么,不要带主观评价。
观察到的现象:
成功了吗?报错了吗?报错信息是什么?
产出物的样子(附截图/照片)。
关键数据:
耗时、准确率、转化率、温度、分数等。
例:前5页成功,第6页开始报错 403 Forbidden。
🧠 深度复盘:分析与结论 (Act)
小顶堆的实现
性质
- 根节点是最小值
- 任意一个节点都 <= 它的左右孩子
用数组存,下标 i:
- 左孩子:2 * i + 1
- 右孩子:2 * i + 2
- 父节点:(i - 1) / 2
需要实现的操作
- add(x):插入元素
- peek():查看堆顶
- poll():删除并返回堆顶
- size():当前元素个数
关键操作
- 上浮 siftUp
- 下层 siftDown
实现步骤
- 定义基本数据结构
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17class MinHeap { private int[] heap; private int size; public MinHeap(int capacity) { heap = new int[capacity]; size = 0; } public int size() { return size; } public boolean isEmpty() { return size == 0; } } - 实现 peek 操作
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21class MinHeap { private int[] heap; private int size; public MinHeap(int capacity) { heap = new int[capacity]; size = 0; } public int size() { return size; } public boolean isEmpty() { return size == 0; } public int peek() { return heap[0]; } } - 上浮操作
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38class MinHeap { private int[] heap; private int size; public MinHeap(int capacity) { heap = new int[capacity]; size = 0; } public int size() { return size; } public boolean isEmpty() { return size == 0; } public int peek() { return heap[0]; } private void siftUp(int index) { while (index > 0) { int parent = (index - 1) / 2; if (heap[index] >= heap[parent]) { break; } swap(index, parent); index = parent; } } private void swap(int i, int j) { int temp = heap[i]; heap[i] = heap[j]; heap[j] = temp; } } - 下沉操作
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58class MinHeap { private int[] heap; private int size; public MinHeap(int capacity) { heap = new int[capacity]; size = 0; } public int size() { return size; } public boolean isEmpty() { return size == 0; } public int peek() { return heap[0]; } private void siftUp(int index) { while (index > 0) { int parent = (index - 1) / 2; if (heap[index] >= heap[parent]) { break; } swap(index, parent); index = parent; } } private void swap(int i, int j) { int temp = heap[i]; heap[i] = heap[j]; heap[j] = temp; } private void siftDown(int index) { while (true) { int left = index * 2 + 1; int right = index * 2 +2; int smallest = index; if (left < size && heap[left] < heap[smallest]) { smallest = left; } if (right < size && heap[right] < heap[smallest]) { smallest = right; } if (smallest == index) { break; } swap(index, smallest); index = smallest; } } } - add 操作
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64class MinHeap { private int[] heap; private int size; public MinHeap(int capacity) { heap = new int[capacity]; size = 0; } public int size() { return size; } public boolean isEmpty() { return size == 0; } public int peek() { return heap[0]; } private void siftUp(int index) { while (index > 0) { int parent = (index - 1) / 2; if (heap[index] >= heap[parent]) { break; } swap(index, parent); index = parent; } } public void add(int val) { heap[size] = val; size++; siftUp(size - 1); } private void swap(int i, int j) { int temp = heap[i]; heap[i] = heap[j]; heap[j] = temp; } private void siftDown(int index) { while (true) { int left = index * 2 + 1; int right = index * 2 +2; int smallest = index; if (left < size && heap[left] < heap[smallest]) { smallest = left; } if (right < size && heap[right] < heap[smallest]) { smallest = right; } if (smallest == index) { break; } swap(index, smallest); index = smallest; } } } - poll 操作
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74class MinHeap { private int[] heap; private int size; public MinHeap(int capacity) { heap = new int[capacity]; size = 0; } public int size() { return size; } public boolean isEmpty() { return size == 0; } public int peek() { return heap[0]; } private void siftUp(int index) { while (index > 0) { int parent = (index - 1) / 2; if (heap[index] >= heap[parent]) { break; } swap(index, parent); index = parent; } } public int poll() { int ans = heap[0]; heap[0] = heap[size - 1]; size --; if (size > 0) { shiftDown(0); } return ans; } public void add(int val) { heap[size] = val; size++; siftUp(size - 1); } private void swap(int i, int j) { int temp = heap[i]; heap[i] = heap[j]; heap[j] = temp; } private void siftDown(int index) { while (true) { int left = index * 2 + 1; int right = index * 2 +2; int smallest = index; if (left < size && heap[left] < heap[smallest]) { smallest = left; } if (right < size && heap[right] < heap[smallest]) { smallest = right; } if (smallest == index) { break; } swap(index, smallest); index = smallest; } } }
下一步行动 (Next Actions):
✅ 验证通过,纳入标准流程。
🔄 验证失败,修改假设,开启下一次实验(EXP-002)。
❓ 产生新问题:[记录新问题]
