本教程基于一个真实测试案例,系统梳理了GPT-4在LeetCode第102场双周赛中的解题表现,完整覆盖了从简单题到困难题的全过程。我们将按照题目顺序逐一解析,深入分析GPT-4的能力边界,并提供实用提示与常见问题解答,帮助你更全面地理解大语言模型在算法问题上的潜力与局限。
0x0. 前言
GPT-4技术报告(https://cdn.openai.com/papers/gpt-4.pdf)的第4节展示了GPT-4的多项能力,在表格的最后三行特别呈现了GPT-4解答LeetCode题目的表现。本文基于这一兴趣点,探索GPT-4配合一个仅负责发出提示词的人类(即完全依赖GPT-4生成代码)能够取得怎样的实际效果。
为保证公平性,我们选取了LeetCode第102场双周赛(2023年4月15日)作为测试数据集。测试者全程只指挥GPT-4编写代码,自身不参与任何编码工作。

首先创建一个新的GPT-4对话:

小提示:测试时建议使用独立对话窗口,避免上下文干扰。每次失败后可以直接将错误信息反馈给GPT-4,让它自行调试修复。
0x1. 第一题(Easy)
第一题是一道简单级别的题目,描述如下:

我们将题目描述输入GPT-4:



GPT-4给出了一个回复,但输出格式不符合LeetCode要求。我们要求它调整格式:


提交后,LeetCode返回了错误信息。我们将错误案例反馈给GPT-4:

修正后再次提交,顺利通过:

- 结果:首次提交出错,简单提示后修正,2次提交通过。
- 关键点:GPT-4能够识别常见逻辑错误,但需要人类提供具体的错误信息来引导修正。
常见问题:如果GPT-4给出的代码格式不符合要求,该怎么办?
答案:直接要求它“按照LeetCode的格式输出完整的类定义,并包含必要的头文件”。也可以让它“仅输出代码,不需要任何解释”。
0x2. 第二题
第二题描述如下:

向GPT-4提问:



提交后:

一次性通过,仅1次提交即成功。
- 小提示:对于模拟题或模板题,GPT-4通常能够一次性正确解答。可以尝试先给它完整的题目描述,再让它自主编写代码。
0x3. 第三题
第三题是一道思维性较强的题目:

向GPT-4提问:




GPT-4给出的方案看起来有些问题,但我们先将代码编译测试:

编译报错。将错误信息返回给GPT-4:


编译通过,但样例测试无法通过。加入更多提示后:



最终生成的代码仍然无法通过样例测试。
- 结果:无法通过提示引导GPT-4给出正确答案,未通过。
- 局限性:对于需要理解隐含逻辑或设计精巧策略的题目,GPT-4容易“胡编乱造”,且难以通过简单提示进行纠正。
常见问题:为什么第三题GPT-4无法解决?
答案:该题涉及树中堂兄弟节点的值替换,需要正确理解“相同深度但不同父节点”这一关键约束条件。GPT-4未能准确建模树的结构,生成的算法逻辑存在错误。这类思维型题目目前仍然是大语言模型的短板。
0x4. 第四题
第四题是一道图论模板题:




GPT-4给出的答案能够通过样例测试:

提交后直接通过:

完整代码如下:
class Graph {
public:
Graph(int n, vector>& edges) {
this->n = n;
for (const auto& edge : edges) {
adjList[edge[0]].push_back({edge[1], edge[2]});
}
}
void addEdge(vector edge) {
adjList[edge[0]].push_back({edge[1], edge[2]});
}
int shortestPath(int node1, int node2) {
vector dist(n, INT_MAX);
dist[node1] = 0;
priority_queue, vector>, greater>> pq;
pq.push({0, node1});
while (!pq.empty()) {
int currNode = pq.top().second;
int currDist = pq.top().first;
pq.pop();
if (currNode == node2) return currDist;
if (currDist > dist[currNode]) continue;
for (const auto& neighbor : adjList[currNode]) {
int nextNode = neighbor.first;
int edgeCost = neighbor.second;
if (currDist + edgeCost < dist[nextNode]) {
dist[nextNode] = currDist + edgeCost;
pq.push({dist[nextNode], nextNode});
}
}
}
return -1;
}
private:
int n;
unordered_map>> adjList;
};
- 结果:1次提交通过。
- 关键点:模板题(如Dijkstra算法)是GPT-4的强项,即使被标记为困难级别也能一次通过,前提是模型在训练数据中见过类似的结构模式。
小提示:对于模板题,可以直接要求GPT-4“使用Dijkstra算法实现”,效果会更理想。但需要注意检查它是否使用了正确的数据结构(例如优先队列)。
0x5. 总结与展望
虽然一次周赛的几道题目不足以得出全面结论,例如本次周赛的困难题实际上是一道板子题,算不上真正的难题(或许将第三题和第四题的顺序交换会更合理)。但GPT-4的表现已经大幅超出预期。
本次测试四道题的表现汇总如下:
- 题目1(简单):首次提交出错,简单提示后修正,2次提交通过
- 题目2(中等):1次提交通过
- 题目3(中等):无法通过提示引导GPT-4给出正确答案,未通过
- 题目4(困难):1次提交通过
不得不承认,GPT-4在模拟题、模板题方面已经展现出相当不错的理解与处理能力。可以预见,在更强大的数据和更大规模模型的加持下,未来大语言模型的解题能力有望超越大多数人类。但是,从提升算法能力的角度而言,我不建议任何读者使用GPT-4来刷LeetCode。因为依赖AI完成题目会削弱独立思考与问题抽象能力的训练,而后者才是算法学习的核心价值所在。
常见问题:GPT-4能替代人类刷LeetCode吗?
答案:不能。目前GPT-4仅对见过类似模式的题目表现良好,对于需要创新思维或精细推理的题目几乎无效。更重要的是,刷题本身是为了锻炼思维能力,使用AI辅助会失去这一核心意义。
