Leetcode 15三题之和

题目要求

题解

指针移动逻辑

去重逻辑

cpp 复制代码
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

class Solution {
public:
    vector<vector<int>> threeSum(vector<int>& nums) {
        vector<vector<int>> res;
        int n = nums.size();
        if (n < 3) return res; // 不足3个元素直接返回空
        
        sort(nums.begin(), nums.end()); // 1. 排序
        
        for (int i = 0; i < n; ++i) {
            // 去重:如果当前数和前一个相同,跳过
            if (i > 0 && nums[i] == nums[i-1]) continue;
            
            int target = -nums[i]; // 要找的两数之和 = -nums[i]
            int left = i + 1;
            int right = n - 1;
            
            while (left < right) {
                int sum = nums[left] + nums[right];
                if (sum == target) {
                    // 找到一组解,加入结果
                    res.push_back({nums[i], nums[left], nums[right]});
                    
                    // 去重:跳过left方向的重复元素
                    while (left < right && nums[left] == nums[left+1]) left++;
                    // 去重:跳过right方向的重复元素
                    while (left < right && nums[right] == nums[right-1]) right--;
                    
                    // 移动指针继续找
                    left++;
                    right--;
                } else if (sum < target) {
                    left++; // 和太小,增大left
                } else {
                    right--; // 和太大,减小right
                }
            }
        }
        return res;
    }
};

// 测试
int main() {
    Solution sol;
    vector<int> nums = {-1, 0, 1, 2, -1, -4};
    vector<vector<int>> ans = sol.threeSum(nums);
    
    // 输出结果
    cout << "[";
    for (int i = 0; i < ans.size(); ++i) {
        cout << "[";
        for (int j = 0; j < 3; ++j) {
            cout << ans[i][j] << (j == 2 ? "" : ",");
        }
        cout << "]" << (i == ans.size()-1 ? "" : ",");
    }
    cout << "]" << endl; // 输出 [[-1,-1,2],[-1,0,1]]
    return 0;
}
相关推荐
神也畏惧菠萝3 分钟前
Day08 Python流程控制从入门到上瘾:if/match/while/for四件套,从B站登录一路打到猜数字游戏
python·算法·数据存储·for·while·if·ifelse
揽星河..25 分钟前
【C语言】分支和循环
c语言·c++·算法
Fuyo_11192 小时前
C++ AVL树保姆级详解:从平衡因子到四大旋转机制
java·c++·算法
jktantan2 小时前
每个节点 41 字节:把一棵百万节点树拆进 14 个 typed array
前端·javascript·vue.js·算法·typescript
揽星河..3 小时前
【C语言】猜数字游戏
c语言·算法·游戏
frjc3 小时前
分布式服务拆分实战指南:从底层逻辑到面试话术
微服务·面试·职场和发展
LabVIEW开发3 小时前
CTM-3 红外测温仪 + LabVIEW 温度怎么测?
算法·labview·测试·labview程序
纪念 2293 小时前
C++算法(六)
开发语言·c++·算法
Dumbness4 小时前
UIA 读微信群消息没有 id,怎么判断哪条是新的:后缀对齐在翻历史和撤回时整屏重报
python·算法