LeetCode --- 三数之和

题目描述

三数之和

代码解析

暴力

在做这一道题的时候,脑海里先想出来的是暴力方法,一次排序,将这个数组变为有序的,再通过三次for循环来寻找满足条件的数字,然后将符合条件的数组与之前符合条件的数组进行一一对比,来完成去重的目的,时间复杂度光是三层for循环就达到了n^3,再加上一个sort和count函数,nlogn + mn^3。

class Solution {
public:bool chech(int a, int b, int c){return a + b + c == 0;}vector<vector<int>> threeSum(vector<int>& na) {vector<vector<int>> ans;int n = na.size();sort(na.begin(), na.end());for (int i = 0; i < n; i++){for (int j = i + 1; j < n; j++){for (int k = j + 1; k < n; k++){if (chech(na[i], na[k], na[j])){vector<int> a(3, 0);a[0] = na[i];a[1] = na[j];a[2] = na[k];if (count(ans.begin(), ans.end(), a) == 0)ans.push_back(a);}}}}return ans;}
};


优化

这个时候要想代码如何进行优化,如何把判重的count和后两层循环给优化了,这样就能把时间复杂度从nlogn + mn^3降低到nlogn + n^2。

要找一个满足条件的三个数,我们可以先固定一个数字,然后就可以只考虑除固定数字之外的区间了,在另一个区间可以找两个指针l和r,如果说l指针指向的数字+r指针指向的数字,等于 事前固定的数字的相反数,就可以达到题目要求了。

如果说l+r > -i,说明r太大,r--;或者说是r + l > -i,说明l太小,l++。当l和r相交的时候依旧没有找到答案,就说明i在某个固定的位置是没有解的,将i++,即可。然后继续在l和r区间寻找符合题意的数字。

题目要求不能有重复的,什么情况下会出现重读的?当l + r == -i的时候,l的下一位或者r的上一位跟l或r本身是相同的,就说明出现了重复的情况,也有可能是i跟i的下一位相同。所以可以以此为条件,来进行去重。也可以将所有符合题意的答案都加入到一个数组当中,然后使用去重算法,也可以达到去重的目的。

class Solution {
public:vector<vector<int>> threeSum(vector<int>& nums) {int n = nums.size();sort(nums.begin(), nums.end());vector<vector<int>> res;for (int i = 0; i < n;){if (nums[i] > 0) break;int l = i + 1, r = n - 1;int t = -nums[i];while (l < r){int sum = nums[l] + nums[r];if (sum > t) r--;else if (sum < t) l++;else {res.push_back({nums[l], nums[r], nums[i]});l++, r--;while (l < r && nums[l] == nums[l - 1]){l++;}while (l < r && nums[r] == nums[r + 1]) {r--;}}}i++;while (i < n && nums[i] == nums[i - 1]) i++;}return res;}
};

 

扩展

四数之和

四数之和和三数之和的代码类似,可以当练习做一下。 

class Solution {
public:vector<vector<int>> fourSum(vector<int>& nums, int target) {int n = nums.size();vector<vector<int>> res;sort(nums.begin(), nums.end());for (int i = 0; i < n ; ){for (int j = i + 1; j < n; ){int l = j + 1;int r = n - 1;long long tmp = nums[i] + nums[j];long long t = target - tmp;while (l < r){if ((long long)(nums[l] + nums[r]) > t) r--;else if ((long long)(nums[l] + nums[r]) < t) l++;else {res.push_back({nums[i], nums[j], nums[l], nums[r]});l++;r--;while (l < r && nums[l] == nums[l - 1]){l++;}while (l < r && nums[r] == nums[r + 1]) {r--;}}}j++;while (j < n && nums[j] == nums[j - 1]) j++;}i++;while (i < n && nums[i] == nums[i - 1]) i++;}return res;}
};

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

欧拉-拉格朗日动力学 Matlab实现

文章目录 欧拉-拉格朗日方程欧拉-拉格朗日方程 使用拉格朗日欧拉动力学公式 (J. J. Uicker, “On the dynamic analysis of spatial linkages using 4 x 4 matrices,” Ph.D. dissertation, Northwestern Univ., Aug. 1965)对任意自由度的机械臂进行逆动力学分析。输入为关节空…

2W字-35页PDF谈谈自己对QT某些知识点的理解

2W字-35页PDF谈谈自己对QT某些知识点的理解 前言与总结总体知识点的概况一些笔记的概况笔记阅读清单 前言与总结 最近&#xff0c;也在对自己以前做的项目做一个知识点的梳理&#xff0c;发现可能自己以前更多的是用某个控件&#xff0c;以及看官方手册&#xff0c;但是没有更…

PHP设计模式初探 以前写的完整PPT!!!!!

幻灯片 1: 初探PHP设计模式 copyright CSDN 白毛大侠 幻灯片 2: 我们说别人代码写的烂&#xff0c;烂在哪&#xff1f; 反思我们平时是怎么写代码的&#xff1f; 非开发者如何转开发&#xff08;业务&#xff09; &#xff1f; 一.过程与对象 幻灯片 3: <?…

MySQL中json类型的字段

有些很复杂的信息&#xff0c;我们一般会用扩展字段传一个json串&#xff0c;字段一般用text类型存在数据库。mysql5.7以后支持json类型的字段&#xff0c;还可以进行sql查询与修改json内的某个字段的能力。 1.json字段定义 ip_info json DEFAULT NULL COMMENT ip信息, 2.按…

ABAP - SALV教程09 颜色( 行、列、单元格 )

SALV只有设置列颜色的处理的方法但是SALV的行颜色和列颜色可以通过输出内表控制,具体实现可以参考&#xff1a;http://t.csdnimg.cn/OiBOXSALV设置列颜色&#xff1a;获取全体列对象的引用调用方法set_color()就能实现 METHODS:set_colors CHANGING co_alv TYPE REF TO cl_…

UCSF DOCK 分子对接详细案例(03)-分子从头设计de novo Design

欢迎浏览我的CSND博客&#xff01; Blockbuater_drug …点击进入 文章目录 前言一、 软件及操作环境二、研究目的三、结构文件准备四、 DOCK中 de novo design4.1 generic de novo design4.2 Rescoring the Outputs对输出重新评分 五、 De Novo Refinement准备配体运行Refineme…

Android Gradle开发与应用 (三) : Groovy语法概念与闭包

1. Groovy介绍 Groovy是一种基于Java平台的动态编程语言&#xff0c;与Java是完全兼容&#xff0c;除此之外有很多的语法糖来方便我们开发。Groovy代码能够直接运行在Java虚拟机&#xff08;JVM&#xff09;上&#xff0c;也可以被编译成Java字节码文件。 以下是Groovy的一些…

C# aes加密解密byte数组

using System.Security.Cryptography; using System.Text;namespace AESStu01;public class AesHelper {// AES加密密钥和向量&#xff08;需要保密&#xff09; private static readonly string Key "";//16长度字符串数字混合private static readonly string IV …

Unity曲柄滑块四杆机构运动计算

一、运动效果 二、机构的介绍 曲柄长度&#xff1a;a&#xff0c;线段AB长度 连杆长度&#xff1a;b&#xff0c;线段BC长度 偏心距离&#xff1a;e&#xff0c;滑块轨迹与曲柄中心点A的垂直距离 三、已知点A点B和e的值&#xff0c;计算C点的位置 1、计算s的值 var h math.…

殿堂级Flink源码极精课程预售

一、为什么我们要读源码? 1、让个人技术快速成长: 优秀的开源框架,底层的源码设计思想也非常优秀,同时还有含有大量的设计模式和并发编程技术&#xff0c;优秀的解决方案,熟读源码对猿们技术提升有很大帮助 2、新技术学习能力: Java开源码框架的源码熟读后&#xff0c;若出现…

2024最新算法:鹦鹉优化算法(Parrot optimizer,PO)求解23个基准函数(提供MATLAB代码)

一、鹦鹉优化算法 鹦鹉优化算法&#xff08;Parrot optimizer&#xff0c;PO&#xff09;由Junbo Lian等人于2024年提出的一种高效的元启发式算法&#xff0c;该算法从驯养的鹦鹉中观察到的觅食、停留、交流和对陌生人行为的恐惧中汲取灵感。这些行为被封装在四个不同的公式中…

学习和工作的投入产出比(节选)

人工智能统领全文 推荐包含关于投入、产出、过剩、市场关注、案例、结果和避雷等主题的信息&#xff1a; 投入与产出&#xff1a; 投入和产出都有直接和间接两类常见形式。常见的四种组合是&#xff1a;直接投入、直接产出、间接投入、间接产出。 过剩&#xff1a; 过剩是一个重…