leetcode第十五题三数之和(最小时空复杂度)

这篇博客介绍了如何利用排序和迭代器解决寻找数组中三数之和为特定值的问题。通过遍历数组并双指针法找到两数之和,实现了低时空复杂度的解决方案。主要涉及C++编程和算法优化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

根本原理就是排序后从第一个数开始先确定一个数字,然后从剩下的数字中找两数之和,直接放带注释的AC代码:

class Solution {
public:
    vector<vector<int>> threeSum(vector<int>& nums) {
        sort(nums.begin(), nums.end());//排个序先
        vector<vector<int>>ans;
        if (nums.size() < 3)return ans;//特殊情况排除
        for (vector<int>::iterator first = nums.begin(); first < nums.end(); first++)
        {
            if (*first > 0)return ans;//若是排序后第一个数都大于0,那确实没法玩了
            if (first > nums.begin() && *first == *(first - 1))continue;//去重
            //开始进入第二层,确定第一个数,然后求两数之和
            vector<int>::iterator second = first+1, third = nums.end() - 1;
            while (second < third)
            {
                if (*second == *(second - 1) && second - 1 != first) { second++; continue; }//去重
                if (third + 1 < nums.end() && *third == *(third + 1)) { third--; continue; }//去重
                if (*second + *third > -*first)third--;//偏大
                else if (*second + *third < -*first)second++;//偏小
                else {
                    ans.push_back({ *first,*second,*third });
                    second++;
                    third--;
                }
            }
        }
        return ans;
    }
};

 因为使用迭代器的原因,时空复杂度很低:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值