news 2026/8/29 4:23:45

文心大模型 LeetCode 15.三数之和 C++实现

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
文心大模型 LeetCode 15.三数之和 C++实现

# LeetCode 15. 三数之和 - C++ 实现


## 解题思路:排序 + 双指针


```
1. 对数组排序
2. 固定第一个数 nums[i],双指针在 [i+1, n-1] 中找两数之和 = -nums[i]
3. 三处去重,避免重复三元组
```


**时间复杂度**: O(n²)
**空间复杂度**: O(log n)(排序栈空间)


---


## C++ 实现


```cpp
#include <vector>
#include <algorithm>
using namespace std;

class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
vector<vector<int>> result;
int n = nums.size();

if (n < 3) return result;

sort(nums.begin(), nums.end()); // 排序

for (int i = 0; i < n - 2; i++) {
// ① 去重:跳过重复的第一个数
if (i > 0 && nums[i] == nums[i - 1])
continue;

// ② 剪枝:最小值 > 0,后面不可能有解
if (nums[i] > 0)
break;

int left = i + 1;
int right = n - 1;
int target = -nums[i]; // 需要找的两数之和

while (left < right) {
int sum = nums[left] + nums[right];

if (sum == target) {
result.push_back({nums[i], nums[left], nums[right]});

// ③ 去重:跳过重复的左指针值
while (left < right && nums[left] == nums[left + 1])
left++;
// ③ 去重:跳过重复的右指针值
while (left < right && nums[right] == nums[right - 1])
right--;

left++;
right--;
}
else if (sum < target) {
left++;
}
else {
right--;
}
}
}

return result;
}
};
```


---


## 测试代码


```cpp
#include <iostream>

int main() {
Solution sol;

// 测试用例 1
vector<int> nums1 = {-1, 0, 1, 2, -1, -4};
vector<vector<int>> res1 = sol.threeSum(nums1);
cout << "Test 1: ";
for (auto& v : res1) {
cout << "[";
for (int j = 0; j < v.size(); j++) {
cout << v[j] << (j < v.size()-1 ? ", " : "");
}
cout << "] ";
}
// 输出: [-1, -1, 2] [-1, 0, 1]

cout << endl;

// 测试用例 2
vector<int> nums2 = {0, 1, 1};
vector<vector<int>> res2 = sol.threeSum(nums2);
cout << "Test 2: ";
for (auto& v : res2) {
cout << "[";
for (int j = 0; j < v.size(); j++) {
cout << v[j] << (j < v.size()-1 ? ", " : "");
}
cout << "] ";
}
// 输出: (空)

cout << endl;

// 测试用例 3
vector<int> nums3 = {0, 0, 0};
vector<vector<int>> res3 = sol.threeSum(nums3);
cout << "Test 3: ";
for (auto& v : res3) {
cout << "[";
for (int j = 0; j < v.size(); j++) {
cout << v[j] << (j < v.size()-1 ? ", " : "");
}
cout << "] ";
}
// 输出: [0, 0, 0]

return 0;
}
```


---


## 关键要点总结


| 要点 | 说明 |
|------|------|
| 排序 | `sort(nums.begin(), nums.end())` |
| 剪枝 | `nums[i] > 0` 时直接 break,因为后面全是正数 |
| 去重① | `i > 0 && nums[i] == nums[i-1]` 跳过重复第一个数 |
| 去重②③ | 找到解后,left/right 跳过相同值再移动 |
| 边界 | `n < 3` 直接返回空 |


---


## 执行流程图解


```
排序后: [-4, -1, -1, 0, 1, 2]

i=0: nums[i]=-4, target=4
left=1,right=5: -1+2=1 < 4 → left++
left=2,right=5: -1+2=1 < 4 → left++
left=3,right=5: 0+2=2 < 4 → left++
left=4,right=5: 1+2=3 < 4 → left++
left=5,right=5: 结束

i=1: nums[i]=-1, target=1
left=2,right=5: -1+2=1 ✓ → [-1,-1,2]
left=3,right=4: 0+1=1 ✓ → [-1, 0,1]

i=2: nums[i]=-1, 与i=1相同 → skip

i=3: nums[i]=0, target=0
left=4,right=5: 1+2=3 > 0 → right--
left=4,right=4: 结束

```
# LeetCode 15. 三数之和 - C++ 实现


## 解题思路:排序 + 双指针


```
1. 对数组排序
2. 固定第一个数 nums[i],双指针在 [i+1, n-1] 中找两数之和 = -nums[i]
3. 三处去重,避免重复三元组
```


**时间复杂度**: O(n²)
**空间复杂度**: O(log n)(排序栈空间)


---


## C++ 实现


```cpp
#include <vector>
#include <algorithm>
using namespace std;

class Solution {
public:
vector<vector<int>> threeSum(vector<int>& nums) {
vector<vector<int>> result;
int n = nums.size();

if (n < 3) return result;

sort(nums.begin(), nums.end()); // 排序

for (int i = 0; i < n - 2; i++) {
// ① 去重:跳过重复的第一个数
if (i > 0 && nums[i] == nums[i - 1])
continue;

// ② 剪枝:最小值 > 0,后面不可能有解
if (nums[i] > 0)
break;

int left = i + 1;
int right = n - 1;
int target = -nums[i]; // 需要找的两数之和

while (left < right) {
int sum = nums[left] + nums[right];

if (sum == target) {
result.push_back({nums[i], nums[left], nums[right]});

// ③ 去重:跳过重复的左指针值
while (left < right && nums[left] == nums[left + 1])
left++;
// ③ 去重:跳过重复的右指针值
while (left < right && nums[right] == nums[right - 1])
right--;

left++;
right--;
}
else if (sum < target) {
left++;
}
else {
right--;
}
}
}

return result;
}
};
```


---


## 测试代码


```cpp
#include <iostream>

int main() {
Solution sol;

// 测试用例 1
vector<int> nums1 = {-1, 0, 1, 2, -1, -4};
vector<vector<int>> res1 = sol.threeSum(nums1);
cout << "Test 1: ";
for (auto& v : res1) {
cout << "[";
for (int j = 0; j < v.size(); j++) {
cout << v[j] << (j < v.size()-1 ? ", " : "");
}
cout << "] ";
}
// 输出: [-1, -1, 2] [-1, 0, 1]

cout << endl;

// 测试用例 2
vector<int> nums2 = {0, 1, 1};
vector<vector<int>> res2 = sol.threeSum(nums2);
cout << "Test 2: ";
for (auto& v : res2) {
cout << "[";
for (int j = 0; j < v.size(); j++) {
cout << v[j] << (j < v.size()-1 ? ", " : "");
}
cout << "] ";
}
// 输出: (空)

cout << endl;

// 测试用例 3
vector<int> nums3 = {0, 0, 0};
vector<vector<int>> res3 = sol.threeSum(nums3);
cout << "Test 3: ";
for (auto& v : res3) {
cout << "[";
for (int j = 0; j < v.size(); j++) {
cout << v[j] << (j < v.size()-1 ? ", " : "");
}
cout << "] ";
}
// 输出: [0, 0, 0]

return 0;
}
```


---


## 关键要点总结


| 要点 | 说明 |
|------|------|
| 排序 | `sort(nums.begin(), nums.end())` |
| 剪枝 | `nums[i] > 0` 时直接 break,因为后面全是正数 |
| 去重① | `i > 0 && nums[i] == nums[i-1]` 跳过重复第一个数 |
| 去重②③ | 找到解后,left/right 跳过相同值再移动 |
| 边界 | `n < 3` 直接返回空 |


---


## 执行流程图解


```
排序后: [-4, -1, -1, 0, 1, 2]

i=0: nums[i]=-4, target=4
left=1,right=5: -1+2=1 < 4 → left++
left=2,right=5: -1+2=1 < 4 → left++
left=3,right=5: 0+2=2 < 4 → left++
left=4,right=5: 1+2=3 < 4 → left++
left=5,right=5: 结束

i=1: nums[i]=-1, target=1
left=2,right=5: -1+2=1 ✓ → [-1,-1,2]
left=3,right=4: 0+1=1 ✓ → [-1, 0,1]

i=2: nums[i]=-1, 与i=1相同 → skip

i=3: nums[i]=0, target=0
left=4,right=5: 1+2=3 > 0 → right--
left=4,right=4: 结束

```

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/29 4:20:32

2026CTF比赛必备常用工具

CTF打MISC&#xff0c;别再瞎琢磨了&#xff01;从摩斯密码到伪加密&#xff0c;5个实操套路全拆解&#xff08;附工具速查&#xff09;同样的题&#xff0c;别人 5 分钟出 flag&#xff0c;你卡了一晚上&#xff1f;不是题难&#xff0c;是套路没摸透。写在前面&#xff1a;MI…

作者头像 李华
网站建设 2026/8/29 4:20:15

Android Studio 2022.1.1 Windows zip版:安装配置与Gradle调优实战

简介&#xff1a;在Windows平台上搭建Android开发环境&#xff0c;核心在于对IDE、SDK和构建工具链的协同管理。Android Studio作为官方集成开发环境&#xff0c;其zip发行版以绿色便携、无需管理员权限等特点&#xff0c;为开发者提供了不同于exe安装包的灵活性。这一形式将ID…

作者头像 李华
网站建设 2026/8/29 4:19:13

Stone Soup AI:从最小骨架到工具调用的渐进式集成实战

你大概听过“石头汤”的故事&#xff1a;几个穷困的旅人走到一个村庄&#xff0c;架起一口大锅&#xff0c;放一块石头进去煮水&#xff0c;说自己在做一锅美味的石头汤。路过的村民好奇&#xff0c;有人送来胡萝卜&#xff0c;有人送来土豆&#xff0c;有人送来几块肉。最后&a…

作者头像 李华
网站建设 2026/8/29 4:18:44

Python骰子游戏开发:从基础语法到项目实战

1. 项目概述&#xff1a;从零构建一个Python骰子猜大小游戏最近在整理自己的代码仓库&#xff0c;翻到了一个几年前写的Python小游戏项目&#xff0c;一个非常经典的“骰子猜大小”游戏&#xff0c;我给它起了个名字叫“欢乐世界”。别看它规则简单&#xff0c;就是一个猜大小的…

作者头像 李华
网站建设 2026/8/29 4:18:00

MPLAB XC编译器与机器学习套件免费开放,助力嵌入式AI开发

1. 从一次免费升级说起&#xff1a;Microchip这次放出了什么做嵌入式开发的朋友&#xff0c;对Microchip这个牌子肯定不陌生。从PIC系列到AVR系列&#xff0c;再到后来的SAM系列&#xff0c;Microchip在8位、16位、32位微控制器市场里占了很大一块地盘。但很多人刚接触这个生态…

作者头像 李华
网站建设 2026/8/29 4:16:58

从Jar到POM:批量反编译与自动化工程重构实战

1. 批量反编译Jar包的工程化实践接手遗留系统时&#xff0c;经常遇到只有Jar包没有源码的情况。上周我就处理了上百个这样的Jar包&#xff0c;手动操作简直让人崩溃。经过实战摸索&#xff0c;我总结出一套高效的批量处理方案&#xff0c;用自动化脚本将反编译效率提升10倍不止…

作者头像 李华