【算法】排序+双指针——leetcode三数之和、四数之和

在这里插入图片描述
三数之和

(1)排序+双指针

  算法思路: 和之前的两数之和类似,我们对暴力枚举进行了一些优化,利用了排序+双指针的思路:

  我们先排序,然后固定⼀个数 a ,接着我们就可以在这个数后面的区间内,使用之前两数之和使用的算法,快速找到两个数之和和固定的a等于target即可。

  但是要注意,为了避免其中有重复的解:

  我们需要在找到⼀个结果之后, left 和 right 指针要跳过重复的元素;同时在使用完一次双指针算法之后,固定的 a 也要跳过重复的元素。

  算法实现过程:

  给定一个包含n个整数的数组nums,函数返回所有不重复的三元组[a, b, c],使得a + b + c = 0。函数首先对数组进行排序,然后使用双指针的方法来遍历数组。外层循环通过变量i遍历数组,内层循环通过变量left和right来找到满足条件的三元组。

  如果三数之和小于0,则将left右移一位;如果大于0,则将right左移一位;如果等于0,则将三个数加入结果数组ret,并继续移动left和right直到找到不重复的三元组。最后,返回结果数组ret。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

class Solution {
public:vector<vector<int>> threeSum(vector<int>& nums) {sort(nums.begin(),nums.end());//排序vector<vector<int>> ret;//定义一个二维数组int n=nums.size();for(int i=0;i<n;){int left=i+1;int right=n-1;if(nums[i]>0) break;//如果最小值大于0,那结果一定大于0while(left<right){int sum=nums[i]+nums[left]+nums[right];if(sum<0) left++;//三数之和小于0,left++else if(sum>0) right--;//三数之和大于0,right--else {ret.push_back({nums[i],nums[left],nums[right]});left++;//找到了一组解后,left和right都要改变right--;//避免重复的解while(left<right&&nums[left]==nums[left-1]) left++;while(left<right&&nums[right]==nums[right+1]) right--;}//跳过相同的值,也是为了避免重复的解}i++;//i也要跳过相同的值,而且i不可以越界,所以要i<nwhile(i<n&&nums[i]==nums[i-1]) i++;}return ret;}
};

时间复杂度:O(n2)
在这里插入图片描述
                            
在这里插入图片描述
四数之和

(1)排序+双指针

  实现方式和三数之和类似,固定两个数即可。

class Solution {
public:vector<vector<int>> fourSum(vector<int>& nums, int target) {vector<vector<int>> ret;//定义一个二维数组sort(nums.begin(),nums.end());//排序int n=nums.size();for(int i=0;i<n;)//固定第一个数{for(int j=i+1;j<n;)//固定第二个数{int left=j+1;int right=n-1;//后面的测试用例比较大,用long longlong long aim=(long long)target-nums[i]-nums[j];while(left<right){int sum=nums[left]+nums[right];if(sum>aim) right--;//如果四数之和大于目标值,right--else if(sum<aim) left++;//如果四数之和小于目标值,left++else {ret.push_back({nums[i],nums[j],nums[left],nums[right]});left++;//left++,right--,避免有重复的情况right--;//跳过相同的数while(left<right&&nums[left]==nums[left-1]) left++;while(left<right&&nums[right]==nums[right+1]) right--;}}j++;//跳过和第二个数相同的数while(j<n&&nums[j]==nums[j-1]) j++;}i++;//跳过和第一个数相同的数while(i<n&&nums[i]==nums[i-1]) i++;}return ret;}
};

时间复杂度:O(N3)
在这里插入图片描述
                            

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

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

相关文章

Mybatis Plus Interceptor

Mybatis Plus Interceptor 1 获取表名2 获取SQL 1 获取表名 Component public class MybatisInterceptor implements Interceptor {private static final List<String> EXCLUDE_TABLE new ArrayList<>();static {EXCLUDE_TABLE.add("test");}private s…

OpenCV实例(九)基于深度学习的运动目标检测(一)YOLO运动目标检测算法

基于深度学习的运动目标检测&#xff08;一&#xff09; 1.YOLO算法检测流程2.YOLO算法网络架构3.网络训练模型3.1 训练策略3.2 代价函数的设定 2012年&#xff0c;随着深度学习技术的不断突破&#xff0c;开始兴起基于深度学习的目标检测算法的研究浪潮。 2014年&#xff0c;…

电脑突然黑屏的解决办法

记录一次电脑使用问题 问题描述 基本情况&#xff1a;雷神游戏笔记本 windows10操作系统 64位 使用时间 4年 日期&#xff1a;2023年8月11日 当时 电脑充着电 打开了两个浏览器&#xff1a;edge[页面加载5个左右]&#xff0c;火狐[页面加载1个左右] 两个文件夹 一个百度网盘…

Davinci 报表工具 0.3.0-rc release 文本框模糊查询不生效问题

背景: 在使用过程中发现davinci 的控制器配置中, 取值配置的对应关系设置 包含 或 不包含时 不生效, 不能实现模糊匹配效果, 只能精确查询; 问题分析: 通过跟踪接口及相应代码, 发现在sql 拼接时没有对 like 和 not like 类型的值两侧添加百分号, 导致模糊查询失败 调用过程…

CentOS系统环境搭建(七)——Centos7安装MySQL

centos系统环境搭建专栏&#x1f517;点击跳转 坦诚地说&#xff0c;本文中百分之九十的内容都来自于该文章&#x1f517;Linux&#xff1a;CentOS7安装MySQL8&#xff08;详&#xff09;&#xff0c;十分佩服大佬文章结构合理&#xff0c;文笔清晰&#xff0c;我曾经在这篇文章…

Kotlin 使用 View Binding

解决的问题&#xff1a; 《第一行代码——Android》第三版 郭霖 P277 视图绑定的问题 描述&#xff1a; kotlin-android-extensions 插件已经弃用 butter knife 已经弃用 解决办法 推荐使用 View Binding 来代替 findViewById 使用方法 1、配置 build.gradle 2、在act…

踩坑---uni-app中@input 事件不生效

在开发的时候遇到这么一种情况&#xff0c;我们希望input输入框的值是范围是0-100或者保留两位小数之类的&#xff0c;当你输入时处理后的结果却不生效&#xff0c;但是试过很多办法发现都实现不了&#xff0c;最后是按照以下方法解决的,问题原因是uni-app会延时,导致输入的结果…

Go语言的主要优势

Go语言的主要优势包括: 1. 简洁和易学 Go语法简单明了,没有太多晦涩难懂的概念,上手容易,适合快速开发。 2. 强大的并发支持 利用goroutine和channel,可以非常方便地编写高效的并发程序。 3. 执行性能好 Go编译成机器码,执行性能接近C/C,比解释型语言更高效。 4. 内存管…

绝对值函数的可导性

绝对值函数的可导性 声明&#xff1a;下面截图来自《考研数学常考题型解题方法技巧归纳》

利用Figlet工具创建酷炫Linux Centos8服务器-登录欢迎界面-SHELL自动化编译安装代码

因为我们需要生成需要的特定字符,所以需要在当前服务器中安装Figlet,默认没有安装包的,其实如果我们也只要在一台环境中安装,然后需要什么字符只要复制到需要的服务器中,并不需要所有都安装。同样的,我们也可以利用此生成的字符用到脚本运行的开始起头部分,用ECHO分行标…

学习笔记十八:污点、容忍度

污点、容忍度 污点、容忍度管理节点污点把k8snode2当成是生产环境专用的&#xff0c;其他node是测试的给k8snode1也打上污点 污点、容忍度 给了节点选则的主动权&#xff0c;我们给节点打一个污点&#xff0c;不容忍的pod就运行不上来&#xff0c;污点就是定义在节点上的键值属…

使用python读Excel文件并写入另一个xls模版

效果如下&#xff1a; 原文件内容 转化后的内容 大致代码如下&#xff1a; 1. load_it.py #!/usr/bin/env python import re from datetime import datetime from io import BytesIO from pathlib import Path from typing import List, Unionfrom fastapi import HTTPExcep…

睿趣科技:抖音开网店现在做还来得及吗

随着社交媒体的迅速发展&#xff0c;抖音作为一款短视频平台&#xff0c;已经在年轻人中间取得了巨大的成功。而近年来&#xff0c;越来越多的人开始考虑在抖音上开设网店&#xff0c;以迎合这一潮流。那么&#xff0c;抖音开网店现在还来得及吗? 首先&#xff0c;要明确的是&…

一篇文章教会你搭建私人kindle图书馆,并内网穿透实现公网访问

搭建私人kindle图书馆&#xff0c;并内网穿透实现公网访问 在电子书风靡的时期&#xff0c;大部分人都购买了一本电子书&#xff0c;虽然这本电子书更多的时候是被搁置在储物架上吃灰&#xff0c;或者成为盖泡面的神器&#xff0c;但当亚马逊发布消息将放弃电子书在中国的服务…

Kubernetes部署Wordpress时碰到的两个问题解决

文章目录 小结问题1解决问题2解决参考 小结 在使用Kubernetes部署Wordpress时返回了两个问题: Function not implemented: AH00141: Could not initialize random number generator chown: changing ownership of .: Operation not permitted 对这个两个返回错误&#xff0…

利用Python隧道爬虫ip轻松构建全局爬虫网络

嘿&#xff0c;爬虫程序员们&#xff01;你们有没有碰到过需要大规模数据爬取的情况&#xff1f;也许你们之前遇到过网站的反爬措施&#xff0c;卡住你们的进度。别担心&#xff0c;今天我来分享一个利用Python隧道爬虫ip实现的方法&#xff0c;帮助你们轻松搭建全局爬虫ip网络…

jmeter界面设置为中文

jmeter版本&#xff1a;5.6.2 找到jmeter下的bin目录&#xff0c;打开jmeter.properties 文件 第39行修改为 languagezh_CN去掉前面的#&#xff0c;以后打开就是中文界面了

IC设计仿真云架构

对于IC仿真来说&#xff0c;最重要的是要安全、可维护、高性能的的HPC环境环境。 那么云上如何搭建起一套完整的IC仿真云环境呢&#xff1f; 这种架构应该长什么样子&#xff1f; 桌面虚拟化基础架构 将所有桌面虚拟机在数据中心进行托管并统一管理&#xff1b;同时用户能够…

RxJava 复刻简版之三,map 多次中转数据

案例代码&#xff1a;https://gitee.com/bobidali/lite-rx-java/commit/292e9227a5491f7ec6a07f395292ef8e6ff69290 RxJava 的调用第一步是封装了观察者接受了数据的处理&#xff0c;进一步就是使用 map 将数据操作传递给上下游 1、类似Observer.create 创建一个简单的观察者…

神经网络基础-神经网络补充概念-05-导数

概念 导数是微积分中的一个概念&#xff0c;用于描述函数在某一点的变化率。在数学中&#xff0c;函数的导数表示函数值随着自变量的微小变化而产生的变化量&#xff0c;即斜率或变化率。 假设有一个函数 f(x)&#xff0c;其中 x 是自变量&#xff0c;y f(x) 是因变量。函数…