C++ 优先算法 —— 四数之和(双指针)

目录

题目:四数之和

1. 题目解析

2. 算法原理

Ⅰ. 暴力枚举

Ⅱ. 双指针算法

不漏的处理:

去重处理:

3. 代码实现

Ⅰ. 暴力枚举

Ⅱ. 双指针算法


题目:四数之和

1. 题目解析

题目截图:

这道题与三数之和(三数之和的解答)及两数之和(两数之和的解答)是很相似的,这道题目要求,也类似于三数之和,它这里的顺序上:

  • 每个四元组的前后顺序可以任意
  • 每个四元组中的数据顺序可以任意

这里target可以不同(target可以随意)。

 

 

2. 算法原理

这里也是同样有两种解法:

  • 暴力枚举
  • 双指针算法

Ⅰ. 暴力枚举

这里方法也是:排序+暴力枚举(从左往右)+去重

类比前面的三数之和:

//伪代码演示
for (int i = 0; i < n; i++) // 固定一个数afor (int j = i + 1; j < n; j++)     //依次固定枚举第二个数for (int k = j + 1; k < n; k++)    //枚举第三个数for(int z = k + 1; z < n; z++)    //枚举第四个数查找符合的四元组,去重...

 这里套了四层for循环,时间复杂度就是O(N⁴)。(会出现超时问题)

Ⅱ. 双指针算法

这里同三数之和也是:排序+双指针+去重

这里就相当于划分成,固定第一个数,剩下的就是利用三数之和思想解决,三数之和中,也是要固定一个数(这里也就是第二个数),接着利用两数之和解决,也就是在剩下的区间内用双指针算法。

总结一下解决方法: 

  1. 依次固定一个数a(从左往右固定a,固定枚举完这一个后,再换下一个)。
  2. 在a的后面的区间内,利用“三数之和”的思想,找到三个数,使这三个数的和等于target-a即可。

这里三数之和:

  1. 依次固定一个数b。
  2. 在b后面的区间内,利用双指针,找到两个数,使这两个数的和等于target-a-b即可。

通过上图可以看到需要套两次for循环加一个while,时间复杂度为O(N²)。 

这里也是需要处理同三数之和的细节问题:

不漏的处理:

也就是确保所有符合条件的情况不漏掉,这里也是找到一种结果之后,不要停(两个指针不停),缩小区间(两指针都向内移动一步),继续寻找符合的情况。

 去重处理:

这里需要考虑三个去重情况:

 

//伪代码演示
for (i = 0; i < n; i++)  //固定数a		//利用三数之和for (j = i + 1; j < n; j++)  //固定数b//双指针while (left < right) //处理数据,并去重		//这里去重同样注意越界问题的判断:left < rightj < ni < n

接下来,实现代码。

3. 代码实现

题目链接:四数之和

Ⅰ. 暴力枚举

//这里时间复杂度:O(N⁴)
class Solution {
public:vector<vector<int>> fourSum(vector<int>& nums, int target) {// 1.排序sort(nums.begin(), nums.end());vector<vector<int>> ret; // 用来存储所有的四元组// 2.暴力枚举int n = nums.size();int i, j, k, z;for (i = 0; i < n;) // 固定一个数a{for (j = i + 1; j < n;) // 依次固定枚举第二个数{for (k = j + 1; k < n;) // 枚举第三个数{for (z = k + 1; z < n;)  // 枚举第四个数{long long sum = (long)nums[i] + nums[j] + nums[k] + nums[z];if (sum == target) {ret.push_back({nums[i], nums[j], nums[k], nums[z]});}// 去重z++z;while (z < n && nums[z] == nums[z - 1]) {++z;}}// 去重k++k;while (k < n && nums[k] == nums[k - 1]) {++k;}}// 去重j++j;while (j < n && nums[j] == nums[j - 1]) {++j;}}// 去重i++i;while (i < n && nums[i] == nums[i - 1]) {++i;}}return ret;}
};

提交记录(这里按理说会超时,时间复杂度:O(N⁴),但这里通过了):

Ⅱ. 双指针算法

//这里时间复杂度是O(N²)
class Solution {
public:vector<vector<int>> fourSum(vector<int>& nums, int target) {// 1.排序sort(nums.begin(), nums.end());vector<vector<int>> ret;int n = nums.size();// 2.利用双指针算法int i, j;for (i = 0; i < n;)  //固定数a{//利用三数之和for (j = i + 1; j < n;)  //固定数b{//双指针int left = j + 1;int right = n - 1;long long t = (long)target - nums[i] - nums[j];  //注意数据溢出问题,用long long解决while (left < right) {int sum = nums[left] + nums[right];if (sum > t) {--right;}else if (sum < t) {++left;}else {// 将获取的四元组尾插ret里ret.push_back({ nums[i], nums[j], nums[left++], nums[right--] });// 缩小区间查找// 不漏,去重// 去重left和right,注意区间越界问题while (left < right && nums[left] == nums[left - 1]) {++left;}while (left < right && nums[right] == nums[right + 1]){--right;}}}// 注意j的去重++j;while (j < n && nums[j] == nums[j - 1]) {++j;}}// 注意去重i++i;while (i < n && nums[i] == nums[i - 1]) {++i;}}return ret;}
};

提交记录:

制作不易,若有不足之处或出问题的地方,请各位大佬多多指教 ,感谢大家的阅读支持!!!   

 

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

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

相关文章

[vulnhub] Corrosion: 2

https://www.vulnhub.com/entry/corrosion-2,745/ 提示&#xff1a;枚举才是神 主机发现端口扫描 使用nmap扫描网段类存活主机 因为靶机是我最后添加的&#xff0c;所以靶机IP是6 &#xff0c;kali是10 nmap -sP 192.168.56.0/24 Starting Nmap 7.94SVN ( https://nmap.org ) …

前端请求后端php接口跨域 cors问题

只需要后端在网站的入口文件 一般都是 index.php 加上 这几行代码就可以了 具体的参数可以根据需要去修改 header("Access-Control-Allow-Origin: *"); header(Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS); header(Access-Control-Allow-Heade…

【星闪EBM-H63开发板】AT固件的配置与测试

引言 前面的博客已经介绍了【星闪EBM-H63开发板】小熊派固件中心的使用_bearpi-bm h63固件烧录工具-CSDN博客和【星闪EBM-H63开发板】固件的烧录-CSDN博客&#xff0c;今天来测试一下另一种固件&#xff0c;也就是AT固件。有关AT固件的介绍参见&#xff1a;【星闪EBM-H63开发板…

Linux基础(十四)——BASH

BASH 1.BASH定义2.shell的种类3.bash的功能3.1 命令记录功能3.2 命令补全功能3.3 命令别名设置3.4 工作控制、 前景背景控制3.5 程序化脚本&#xff1a; &#xff08; shell scripts&#xff09;3.6 万用字符 4.bash的内置命令5.shell的变量功能5.1 变量的取用5.2 新建变量5.3 …

【前端学习笔记】JavaScript学习一【变量与数据类型】

一、变量 变量是计算机中用来存储数据的“容器”&#xff0c;通俗的理解变量就是使用【某个符号】来代表【某个具体的数值】&#xff08;数据&#xff09; 声明&#xff1a;声明(定义)变量有两部分构成&#xff1a;关键字 变量名 JavaScript 使用关键字 let 和 var 来声明&am…

使用Git工具在GitHub的仓库中上传文件夹(超详细)

如何使用Git工具在GitHub的仓库中上传文件夹&#xff1f; 如果觉得博主写的还可以&#xff0c;点赞收藏关注噢~ 第一步&#xff1a;拥有一个本地的仓库 可以fork别人的仓库或者自己新创建 fork别人的仓库 或者自己创建一个仓库 按照要求填写完成后&#xff0c;点击按钮创建…

Linux kernel 堆溢出利用方法(二)

前言 本文我们通过我们的老朋友heap_bof来讲解Linux kernel中off-by-null的利用手法。在通过讲解另一道相对来说比较困难的kernel off-by-null docker escape来深入了解这种漏洞的利用手法。&#xff08;没了解过docker逃逸的朋友也可以看懂&#xff0c;毕竟有了root权限后&a…

福昕阅读器高级版解决文件上传IEEE PDF eXpress字体未嵌入

文件上传IEEE PDF eXpress字体未嵌入问题 Errors: Font Arial-BoldMT, Arial-ItalicMT, ArialMT is not embedded (93x on pages 2-3,5) 因为没安装adobe&#xff0c;尝试使用福昕阅读器高级版解决&#xff08;学校统一买的&#xff0c;不知道普通版行不行&#xff09; 找到潜…

人工智能在智能家居的应用

AI 在智能家居场景中&#xff0c;一方面将进一步推动家居生活产品的智能化&#xff0c;包 括照明系统、音箱系统、能源管理系统、安防系统等&#xff0c;实现家居产品从感知到认知再到决策的 发展&#xff1b;另一方面在于智能家居系统的建立&#xff0c;搭载人工智能的多款产品…

如何管理好自己的LabVIEW项目

在LabVIEW项目开发中&#xff0c;项目管理对于提高开发效率、确保项目质量、减少错误和维护成本至关重要。以下从项目规划、代码管理、测试与调试、版本控制、团队协作等方面&#xff0c;分享LabVIEW项目管理的体会。 ​ 1. 项目规划与需求分析 关键步骤&#xff1a; 需求分析…

51c自动驾驶~合集10

我自己的原文哦~ https://blog.51cto.com/whaosoft/11638131 #端到端任务 说起端到端&#xff0c;每个从业者可能都觉得会是下一代自动驾驶量产方案绕不开的点&#xff01;特斯拉率先吹响了方案更新的号角&#xff0c;无论是完全端到端&#xff0c;还是专注于planner的模型&a…

vs2022搭建opencv开发环境

1 下载OpenCV库 https://opencv.org/ 下载对应版本然后进行安装 将bin目录添加到系统环境变量opencv\build\x64\vc16\bin 复制该路径 打开高级设置添加环境变量 vs2022新建一个空项目 修改属性添加头文件路径和库路径 修改链接器&#xff0c;将OpenCV中lib库里的o…

蓝牙音响音频功放:【矽源特HAA9809 AB+D类自动切换】

目录 1&#xff1a;HAA9809特性 2&#xff1a;典型应用电路 3&#xff1a;CTRL管脚控制信息 4&#xff1a;一线脉冲控制方式 5&#xff1a;输入电阻&#xff0c;调节放大增益 6&#xff1a;输入电容&#xff0c;调节频响 7&#xff1a;总结 矽源特ChipSourceTek-HAA9809…

大语言模型安全,到底是什么的安全

什么是AI安全 自ChatGPT问世以来&#xff0c;市场上涌现出了众多大型语言模型和多样化的AI应用。这些应用和模型在为我们的生活带来便利的同时&#xff0c;也不可避免地面临着安全挑战。AI安全&#xff0c;即人工智能安全&#xff0c;涉及在人工智能系统的开发、部署和使用全过…

云岚到家 秒杀抢购

目录 秒杀抢购业务特点 常用技术方案 抢券 抢券界面 进行抢券 我的优惠券列表 活动查询 系统设计 活动查询分析 活动查询界面显示了哪些数据&#xff1f; 面向高并发如何提高活动查询性能&#xff1f; 如何保证缓存一致性&#xff1f; 数据流 Redis数据结构设计 如…

餐饮点餐系统(2)

今天我们继续完成我们的项目&#xff0c;本次的目标是为每一个分支选项&#xff0c;创建菜单。 分析&#xff1a;1.首先我们要为每一个分支选项创建一个函数 2.其次是调用我们创建的函数 3.最后创建的自定义函数中会用到&#xff0c;while语句&#xff0c;switch语句&#xff…

某军工变压器企业:通过集团级工业IOT平台,实现数字化转型

概述 近年来&#xff0c;随着全球电力需求的增长和智能电网的推进&#xff0c;变压器市场规模持续扩大。2023年&#xff0c;全球配电变压器市场规模达到143.21亿美元&#xff0c;同比增长8.12%。中国配电变压器市场规模在2023年达到194.35亿元&#xff0c;同比增长14.53%‌。此…

caozha-CEPCS(新冠肺炎疫情防控系统)

caozha-CEPCS&#xff0c;是一个基于PHP开发的新冠肺炎疫情防控系统&#xff0c;CEPCS&#xff08;全称&#xff1a;COVID-19 Epidemic Prevention and Control System&#xff09;&#xff0c;可以应用于单位、企业、学校、工业园区、村落等等。小小系统&#xff0c;希望能为大…

第8章利用CSS制作导航菜单

8.1 水平顶部导航栏 <!DOCTYPE html> <html><head><meta charset"utf-8" /><title></title></head><body><center><h3>简单水平菜单导航栏</h3></center><hr /><nav><ul&g…

《青牛科技GC6150:摇头机驱动芯片的卓越替代品,超越 TMI8150》

在终端工程师们精心打造的科技世界里&#xff0c;摇头机的性能优化一直是关注焦点。今天&#xff0c;我们要向各位终端工程师介绍一款具有革命性的驱动芯片 —— 芯麦 GC6150&#xff0c;它宛如一颗耀眼的明星&#xff0c;在摇头机驱动领域绽放光芒&#xff0c;并且能够完美替代…