Letcode经典黄题——三数之和

news2024/11/15 0:06:23

还是那句话,一个题思路很重要,没有思路等于无头苍蝇乱撞

题目要求:给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i != j、i != k 且 j != k ,同时还满足 nums[i] + nums[j] + nums[k] == 0 。请

你返回所有和为 0 且不重复的三元组。

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

第一种
我们可以采用暴力的手法,直接整三个循环,但是这样有很多弊端.
1.复杂度太高下来的话他需要O(n^3)。
2.最最关键的是不能重复。
第二种
我们可以采用排序加双指针的方法来完成。
1.排序的话个人建议不要用库里面的函数,我们能自己敲尽量自己敲,巩固我们的知识,当然我指的是快排之类的而不是那些冒泡选择排序。
2.双指针从左到右依次遍历,当我们从小到大将数字排好之后,如果检测到数字小则左边向右移一位,如果检测到数字大我们将右边指针向左移一位。
3.为了避免重复 我们在中间设立while循环 如果这个数和下一个数相等我们++,直至不相等再开始比较。
特别注意
本题需要返回的要求有三点
在这里插入图片描述
第一个意思就是:returnSize表示返回数组的行数。
第二个意思是:数组的大小以
returnColumnSizes数组的形式返回。
第三个意思是:返回的数组和*columnSizes数组都必须进行mallocated,假设调用者调用free()。

下面看具体代码实现
首先排序这边我们使用快排:Quicksort(nums,0,numsSize-1);

int Sort(int* arr,int left,int right)
 {
     int i=left,j=right;
     int temp=arr[i];
     while(i<j)
     {
        while(i<j&&arr[j]>=temp)
        j--;
        arr[i]=arr[j];
        while(i<j&&arr[i]<=temp)
        i++;
        arr[j]=arr[i];
     }
     arr[i]=temp;
     return i;
 }

 void Quicksort(int* arr,int left,int right)
 {
    if(left<right)
    {
        int i=Sort(arr,left,right);
        Quicksort(arr,left,i-1);
        Quicksort(arr,i+1,right);
    }
 }

排序好之后
我们进行双指针查找,
由于力扣一直在跟我讲空间不够,所以我一气之下直接开了10w个空间

int** threeSum(int* nums, int numsSize, int* returnSize, int** returnColumnSizes)
{
    int** res=(int**)malloc(sizeof(int)*100000);//存储答案
    *returnColumnSizes=(int*)malloc(sizeof(int)*100000);//题目要求
    Quicksort(nums,0,numsSize-1); //快排对数组进行排序
    * returnSize=0; //返回的row
    for(int i=0;i<numsSize;i++)//右左向右一个数一个数遍历
    {
        if(i>0&&nums[i]==nums[i-1])  //判断最初是否和前一个相等,避免重复项
        {
            continue;
        }
        int left=i+1,right=numsSize-1;
        while(left<right)  //双指针遍历
        {
            if(nums[left]+nums[right]==-nums[i])  //满足条件存入数组
            {
                res[*returnSize]=(int*)malloc(sizeof(int)*3);  //开辟空间
                (*returnColumnSizes)[*returnSize]=3;
                res[*returnSize][0]=nums[i];
                res[*returnSize][1]=nums[left];
                res[*returnSize][2]=nums[right];
                (*returnSize)++;
            }
            if(nums[left]+nums[right]<-nums[i]) //如果小于目标值则left++
            {
                while(left<right&&nums[left]==nums[left+1])//避免重复
                left++;
                left++; 
            }
            else//如果大于目标值则right--
            {
                while(left<right&&nums[right]==nums[right-1]) //避免重复
                right--;
                right--;
            }
        }
    }
    return res;//返回结果数组
}

时间复杂度分析,从左到右遍历是O(n),双指针是O(n),嵌套则是O(n^2).

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/635561.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

chatgpt赋能python:Python怎么变黑?探索Python黑科技的奥秘

Python怎么变黑&#xff1f;探索Python黑科技的奥秘 如果你在网上搜索“Python怎么变黑”&#xff0c;你会看到很多关于Python黑客技术的讨论。但是&#xff0c;这篇文章将会聚焦于Python如何变得更“黑”&#xff0c;即在SEO优化方面如何利用Python。 Python在SEO优化中的作…

华硕天选4原装Windows11系统带ASUSRECOVERY恢复工厂模式安装

华硕工厂恢复系统 &#xff0c;安装结束后带隐藏分区以及机器所有驱动软件,奥创Myasus Recovery 文件地址https://pan.baidu.com/s/1Pq09oDzmFI6hXVdf8Vqjqw?pwd3fs8 提取码:3fs8 文件格式&#xff1a;5个底包(HDI KIT COM MCAFEE EDN) 1个引导工具TLK 支持ASUSRECOVERY型…

chatgpt赋能python:Python和Envi:完美结合的最佳方案

Python和Envi&#xff1a;完美结合的最佳方案 如果你正在寻找一种可靠的方法来将Python编程与Envi软件结合起来&#xff0c;那么你来对地方了&#xff01;在本篇文章中&#xff0c;我们将介绍如何使用Python编程语言和Envi软件相互结合&#xff0c;从而让你的数据分析和地理信…

价值8k的电子书小程序源码+前端(含教程)

&#x1f388; 限时活动领体验会员&#xff1a;可下载程序网创项目短视频素材 &#x1f388; &#x1f389; 有需要的朋友记得关赞评&#xff0c;阅读文章底部来交流&#xff01;&#xff01;&#xff01; &#x1f389; ✨ 源码介绍 价值8k的电子书小程序源码_附完整教程 无意…

chatgpt赋能python:Python的字符串处理功能:取出字符串的每一位

Python的字符串处理功能&#xff1a;取出字符串的每一位 Python是广泛应用于Web开发、数据分析、机器学习、人工智能和爬虫等领域的一门程序语言。其中&#xff0c;字符串是Python最常见的数据类型之一&#xff0c;也是Web开发中交互数据的主要形式。在Python中&#xff0c;字…

UDS关于0x34服务请求下载学习

1.服务介绍 客户端使用requestDownload服务启动从客户端到服务器的数据传输&#xff08;下载&#xff09;。在服务器收到requestDownload请求消息后&#xff0c;服务器应采取一切必要措施接收数据&#xff0c;然后再发送肯定响应消息。 2.请求消息 2.1请求消息定义 C1&#x…

javaSE -- 注解学习笔记

参考资料&#xff1a;https://blog.csdn.net/KingBoyWorld/article/details/105337011 https://blog.csdn.net/qq_42843172/article/details/107293408 1.注解是什么&#xff1f; java注解是一个写在接口、类、属性方法上的一个标签。跟注释不同&#xff0c;能够影响代码。 …

算法模板(5):数学(1):数学知识(1)

数论 整数的整除性 [x]表示不超过x的最大整数&#xff0c;叫做取整函数或高斯函数。设整数a&#xff0c;b不同时为零&#xff0c;则存在一对整数m&#xff0c;n&#xff0c;使得 ( a , b ) a m b n (a, b) am bn (a,b)ambn。注&#xff1a;a和b的最大公因数会写成 (a, b)…

vue3中使用Vuex

目录 什么是Vuex安装和配置Vuex安装Vuex配置Vuex 使用VuexState定义State访问State MutationsMutations 的特点定义Mutations触发Mutations 修改State中的状态 ActionAction 的特点和作用定义Action触发Action GetterGetter 的特点和作用定义Getter获取Getter ModuleModule 的特…

ARM基础(4):L1 Cache之I-Cache和D-cache详解

在上一篇文章ARM基础(3)&#xff1a;MPU内存保护单元详解及例子中&#xff0c;我介绍了MPU&#xff0c;我们知道MPU允许按区域修改一级Cache的属性&#xff0c;这个Cache一般为L1 Cache&#xff0c;它位于CPU的内部&#xff0c;用来加快指令和数据的访问速度。同时&#xff0c;…

chatgpt赋能python:如何在Python和Java之间进行整合

如何在Python和Java之间进行整合 在现在这个编程的时代里&#xff0c;使用一种编程语言或一种技术通常不能满足所有的需求。因此&#xff0c;当你需要在Python和Java之间进行整合时&#xff0c;这篇文章就为你介绍了一些解决方案。 为什么需要Python和Java进行整合 Python和…

redis 字典的实现

1.数据结构 节点数据结构 因为是基于开链法的哈希表实现&#xff0c;所以需要维护了一个next节点 typedef struct dictEntry {void *key;union {void *val;uint64_t u64;int64_t s64;double d;} v;struct dictEntry *next; } dictEntry; 复制 哈希表数据结构 其中size是当…

景区旅游多商户版小程序v14.3.1+前端

&#x1f388; 限时活动领体验会员&#xff1a;可下载程序网创项目短视频素材 &#x1f388; &#x1f389; 有需要的朋友记得关赞评&#xff0c;文章底部来交流&#xff01;&#xff01;&#xff01; &#x1f389; ✨ 源码介绍 【新增】全新授权登录支持取消登录 【新增】商…

3.12生产者消费者模型 3.13条件变量 3.14信号量 C++实现生产者消费者模型

3.12生产者消费者模型 生产者消费者模型中的对象&#xff1a; 1、生产者 2、消费者 3、容器 若容器已满&#xff0c;生产者阻塞在这&#xff0c;通知消费者去消费&#xff1b;若容器已空&#xff0c;则消费者阻塞&#xff0c;通知生产者去生产。生产者可以有多个&#xff0c;消…

RK3588平台开发系列讲解(USB篇)Linux Android USB软件架构

平台内核版本安卓版本RK3588Linux 5.10Android 12文章目录 一、高通平台USB软件架构二、USB 设备侧软件组成2.1、OTG driver2.2、Device controller driver2.3、Gadget framework2.4、Function drivers三、USB 主机侧软件3.1、Host controller driver3.2、USB core3.3、USB PHY…

chatgpt赋能python:Python取消断点的方法

Python取消断点的方法 在Python开发过程中&#xff0c;我们经常需要设置断点来帮助我们调试代码。但是&#xff0c;有时候我们可能需要取消已设置的断点。本文将介绍如何取消Python中的断点。 1. 什么是断点 在Python中&#xff0c;断点是为了帮助调试代码而设置的一个标志。…

网络层:IPv4地址

网络层&#xff1a;IPv4地址 笔记来源&#xff1a; 湖科大教书匠&#xff1a;IPv4地址概述 湖科大教书匠&#xff1a;分类编址的IPv4地址 湖科大教书匠&#xff1a;划分子网的IPv4地址 湖科大教书匠&#xff1a;无分类编址的IPv4地址 IPv4地址就是给因特网(Internet)上的每一…

零售场景梳理和运筹优化工作经验总结

文章目录 亡羊补牢不为迟零售行业规模大卷出零售新高度运筹优化实践经验 亡羊补牢不为迟 由于工作岗位变动的缘故&#xff0c;暂时要告别零售场景了。当初自己没想太多就一头扎进了“新”零售这个场景&#xff0c;迄今为止都没有针对零售场景做一个通盘的梳理&#xff0c;现在…

御2pro,带屏遥控器航测设置

御2遥控器航测设置 0 前言1 遥控器设置2 航测软件设置3 航测设置 0 前言 无人机&#xff1a;御2 或者御2 pro&#xff0c;非变焦版本遥控器&#xff1a;大疆带屏控器 RM500 1 遥控器设置 默认的遥控器控制软件CONNECT只能航拍&#xff0c;无法航测&#xff0c;必须调节为航…

Docker常用基本命令

一、docker的基础命令 1、启动docker systemctl start docker 2、关闭docker systemctl stop docker 3、重启docker systemctl restart docker 4、设置docker开机自启动 systemctl enable docker 5 &#xff0c; 查看docker运行状态&#xff08;显示绿色代表正常启动…