3Sum

本文介绍了一种高效算法来寻找数组中所有和为零的唯一三元组,通过排序数组并使用双指针技术实现,显著降低了时间复杂度。

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

  • Given an array S of n integers, are there elements a, b, c in S such that a + b + c = 0? Find all unique triplets in the array which gives the sum of zero.

  • Note:
    Elements in a triplet (a,b,c) must be in non-descending order. (ie, a ≤ b ≤ c)
    The solution set must not contain duplicate triplets.
    For example, given array S = {-1 0 1 2 -1 -4},

    A solution set is:
    (-1, 0, 1)
    (-1, -1, 2)


    先对集合S排序,这样耗费NO(logN)的时间,然后再分别计算三个数的和, 需要O(N)的时间复杂度,目前这是我能想到的时间复杂度和空间复杂比较低的方法了。不多说,C++代码如下:

class Solution {
public:
vector<vector<int> > threeSum(vector<int> &num) {
    vector<vector<int> > ret;
    int i, j, k, n = num.size();
    sort(num.begin(), num.begin() + n);
    for (i = 0; i < n; i++){
        if (i > 0 && num[i] == num[i - 1]) continue;
        k = n - 1;
        j = i + 1;
        while (j < k){
            if (num[i] + num[j] + num[k] > 0) k--;
            else if (num[i] + num[j] + num[k] < 0) j++;
            else{
                vector<int> tmp;
                tmp.push_back(num[i]);
                tmp.push_back(num[j]);
                tmp.push_back(num[k]);
                ret.push_back(tmp);

                while (j < k && num[k] == num[k - 1]) k--;
                while (j < k && num[j] == num[j + 1]) j++;
                k--; j++;
            }
        }
    }
    return ret;
}
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值