【LeetCode】三数之和【排序,固定一个数,然后双指针寻找另外两个数】

news/2024/5/19 23:36:49 标签: 数据结构, 算法, leetcode, 动态规划, 快速排序

给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组。

注意:答案中不可以包含重复的三元组。

例如, 给定数组 nums = [-1, 0, 1, 2, -1, -4],

满足要求的三元组集合为:
[
   [-1, 0, 1],
   [-1, -1, 2]
]

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/3sum

分析:

暴力法的复杂度是O(N^3),肯定会超时

先将数组排序,假设k1<=k2<=k3,先固定k1,然后通过双指针法在k1的后面寻找k2和k3

可以利用的性质:

1.如果k1大于0,则三数之和肯定无法等于0,可以跳过该k1

2.如果v[i]==v[i-1],那么i-1可以跳过,因为这样必然会导致重复结果

可以采用set去除重复结果

时间复杂度:O(N^2)

排序的复杂度是O(N*log N),但是后续固定看+双指针的复杂度是O(N^2),二者取大的,所以时间复杂度是O(N^2)

空间复杂度:快排需要,最好情况:O(log N),最坏情况:O(N)

code:

class Solution {
public:
vector<vector<int> > threeSum(vector<int>& a)
{
    vector<vector<int> > vv;
    vector<int> v;
    set<vector<int> > s;
    set<vector<int> >::iterator it;
    int n=a.size();
    if(n<3)
        return vv;
    sort(a.begin(),a.end());
    for(int k=0;k<n-2;k++)
    {
        if(a[k]>0)
            continue;
        if(k>0&&a[k-1]==a[k])
            continue;
        int l=k+1;
        int h=n-1;
        //cout<<"k="<<k<<"l="<<l<<" h="<<h<<endl;
        s.clear();
        while(l<h)
        {
            int ans=a[k]+a[l]+a[h];
            //cout<<"l="<<l<<" h="<<h<<"ans="<<ans<<endl;
            if(ans==0)
            {
                v.clear();
                v.push_back(a[k]);
                v.push_back(a[l]);
                v.push_back(a[h]);
                s.insert(v);
                l++;
                h--;
            }else if(ans<0)
            {
                l++;
            }else if(ans>0)
            {
                h--;
            }
        }
        if(s.size()!=0)
        {
            for(it=s.begin();it!=s.end();it++)
            {
                vv.push_back(*it);
            }
        }
    }
    return vv;
}
};

http://www.niftyadmin.cn/n/870451.html

相关文章

LeetCode-三数之和(排序,固定一个数,然后双指针寻找另外两个数)

给定一个包含 n 个整数的数组 nums&#xff0c;判断 nums 中是否存在三个元素 a&#xff0c;b&#xff0c;c &#xff0c;使得 a b c 0 &#xff1f;找出所有满足条件且不重复的三元组。 注意&#xff1a;答案中不可以包含重复的三元组。 例如, 给定数组 nums [-1, 0, 1, 2…

Python正则表达式实例详解

一、正则表达式语法 正则表达式是用匹配或者描述字符串的工具。 用处&#xff1a; a.判断字符串是否满足某个条件—判断输入的字符串是否是邮箱/手机号码。是否是ip地址 b.提取满足条件的字符串 c.字符串替换 Python中通过re模块中相应的方法来支持正则表达式的匹配、查找和替…

【LeetCode】最接近的三数之和【排序,固定k1,二分寻找k2和k3】

给定一个包括 n 个整数的数组 nums 和 一个目标值 target。找出 nums 中的三个整数&#xff0c;使得它们的和与 target 最接近。返回这三个数的和。假定每组输入只存在唯一答案。例如&#xff0c;给定数组 nums [-1&#xff0c;2&#xff0c;1&#xff0c;-4], 和 target 1.与…

pandas中loc,iloc,ix,at,iat详解

阅读目录 1. 数据筛选2. csv操作本博主要总结DaraFrame数据筛选方法&#xff08;loc,iloc,ix,at,iat&#xff09;&#xff0c;并以操作csv文件为例进行说明 回到顶部 1. 数据筛选 a b c 0 0 2 4 1 6 8 10 2 12 14 16 3 18 20 22 4 24 26 28 5 30 …

【LeetCode】四数之和【排序,固定k1,k2,二分寻找k3和k4】

给定一个包含 n 个整数的数组 nums 和一个目标值 target&#xff0c;判断 nums 中是否存在四个元素 a&#xff0c;b&#xff0c;c 和 d &#xff0c;使得 a b c d 的值与 target 相等&#xff1f;找出所有满足条件且不重复的四元组。 注意&#xff1a; 答案中不可以包含重复…

Pandas的read_csv函数参数分析

Pandas的read_csv函数参数分析 函数原型 pd.read_csv(filepath_or_buffer, sep,, delimiterNone, headerinfer, namesNone, index_colNone, usecolsNone, squeezeFalse, prefixNone, mangle_dupe_colsTrue, dtypeNone, engineNone, convertersNone, true_valuesNone, false_v…

【LeetCode】删除链表的倒数第N个节点【双指针法】

给定一个链表&#xff0c;删除链表的倒数第 n 个节点&#xff0c;并且返回链表的头结点。示例&#xff1a;给定一个链表: 1->2->3->4->5, 和 n 2.当删除了倒数第二个节点后&#xff0c;链表变为 1->2->3->5.说明&#xff1a;给定的 n 保证是有效的。进阶…

Pandas中DataFrame基本函数高阶函数数学运算整理

【python】Pandas中DataFrame基本函数整理&#xff08;全&#xff09;