【算法专题】双指针算法之18. 四数之和(力扣)

 欢迎来到 CILMY23的博客

🏆本篇主题为:双指针算法之18. 四数之和(力扣)

🏆个人主页:CILMY23-CSDN博客

🏆系列专栏:Python | C++ | C语言 | 数据结构与算法 | 贪心算法 | Linux | 算法专题 | 代码训练营

🏆感谢观看,支持的可以给个一键三连,点赞收藏+评论。如果你觉得有帮助,还可以点点关注


题目:

18. 四数之和 - 力扣(LeetCode)

给你一个由 n 个整数组成的数组 nums ,和一个目标值 target 。请你找出并返回满足下述全部条件且不重复的四元组 [nums[a], nums[b], nums[c], nums[d]] (若两个四元组元素一一对应,则认为两个四元组重复):

  • 0 <= a, b, c, d < n
  • abc 和 d 互不相同
  • nums[a] + nums[b] + nums[c] + nums[d] == target

你可以按 任意顺序 返回答案 。

题目解析:

 这道题在有二数之和和三数之和的前提上,理解起来是比较快的。

1.给了一个目标值target

2.不重复的四元组 [nums[a], nums[b], nums[c], nums[d]] 

3.找出不重复的四元组

  • 0 <= a, b, c, d < n
  • abc 和 d 互不相同
  • nums[a] + nums[b] + nums[c] + nums[d] == target

算法原理:

 个人感觉:感觉四数之和比三数之和难多了

首先根据前两题的经验,我们很快就能推算出,这是一题双指针算法的题目,大致思路还是跟之前一样,双指针求和,然后去重。

所以我们能写出如下代码:

class Solution
{
public:static vector<vector<int>> fourSum(vector<int>& nums, int target){vector<vector<int>> ret;//排序数组sort(nums.begin(), nums.end());int k = nums.size() - 1; //固定kfor (k = nums.size() - 1; k > 2;){for (int j = k - 1; j > 1;){int sum1 = nums[k] + nums[j];int left = 0;int right = j - 1;while (left < right){int sum2 = nums[left] + nums[right];if (sum2 + sum1 == target){ret.push_back({ nums[left],nums[right],nums[j],nums[k] });left++;right--;}else if (sum2 > (target - sum1)){right--;}else if (sum2 < (target - sum1)){left++;}}}}return ret;}
};

第一个,我用一个sum1进行存储两个固定的数的值,sum2存储两个指针的值。

接下来是重点,我的两个指针和两个固定的值相加要和target一样,所以两个指针的值要和target-sum1进行比较。

 这个很重要,我当时和sum1比较发现是行不通的,没把target搞进去,因为我们最终是要和target目标值进行比较的。

接下来是去重,首先,是两个指针的去重,这个相对容易一些。

while (left < right && nums[left - 1] == nums[left])
{left++;
}
while (left < right && nums[right + 1] == nums[right])
{right--;
}

其次是两个固定数的去重,由于我这次去重将放在循环的末尾了,所以会有一些变化。

for (k = nums.size() - 1; k > 2;)
{for (int j = k - 1; j > 1;){//......while (left < right){//......}j--;//j去重while (j > 1 && nums[j + 1] == nums[j]){j--;}}k--;//k去重while (k > 2 && nums[k + 1] == nums[k]){k--;}
}

 去重前,先保证固定的数会走到下一个位置,然后再进行比较。

然后还有一个坑的点是这题

会出现一个数值过大的问题,所以要把sum1和sum2都改成long long即可。 

代码编写:

class Solution
{
public:static vector<vector<int>> fourSum(vector<int>& nums, int target){vector<vector<int>> ret;//排序数组sort(nums.begin(), nums.end());int k = nums.size() - 1; //固定kfor (k = nums.size() - 1; k > 2;){for (int j = k - 1; j > 1;){long long int sum1 = nums[k] + nums[j];int left = 0;int right = j - 1;while (left < right){long long int sum2 = nums[left] + nums[right];if (sum2 + sum1 == target ){ret.push_back({ nums[left],nums[right],nums[j],nums[k] });left++;right--;while (left < right && nums[left - 1] == nums[left]){left++;}while (left < right && nums[right + 1] == nums[right]){right--;}}else if (sum2 > (target-sum1)){right--;}else if (sum2 < (target-sum1)){left++;}}j--;//j去重while (j > 1 && nums[j + 1] == nums[j]){j--;}}k--;//k去重while (k > 2 && nums[k + 1] == nums[k]){k--;}}return ret;}
};

🛎️感谢各位同伴的支持,本期C++算法专题就讲解到这啦,下期我们将详解滑动窗口知识点,如果你觉得写的不错的话,可以给个一键三连,点赞,收藏+评论,可以的话还希望点点关注,若有不足,欢迎各位在评论区讨论。    

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

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

相关文章

ProxmoxPVE虚拟化平台--U盘挂载、硬盘直通

界面说明 ### 网络设置 ISO镜像文件 虚拟机中使用到的磁盘 挂载USB设备 这个操作比较简单&#xff0c;不涉及命令 选中需要到的虚拟机&#xff0c;然后选择&#xff1a; 添加->USB设置选择使用USB端口&#xff1a;选择对应的U盘即可 硬盘直通 通常情况下我们需要将原有…

【Linux 16】进程间通信的方式 - 共享内存

文章目录 &#x1f308; 一、共享内存概述⭐ 1. 什么是共享内存⭐ 2. 如何实现共享内存⭐ 3. 操作系统允许存在多个共享内存⭐ 4. 操作系统如何管理共享内存⭐ 5. 获取共享内存的唯一标识符 key⭐ 6. 为什么要由用户提供 key &#x1f308; 二、查看共享内存⭐ 1. 使用 ipcs -m…

TCP 协议的 time_wait 超时时间

优质博文&#xff1a;IT-BLOG-CN 灵感来源 Time_Wait 产生的时机 TCP四次挥手的流程 如上所知&#xff1a;客户端在收到服务端第三次FIN挥手后&#xff0c;就会进入TIME_WAIT状态&#xff0c;开启时长为2MSL的定时器。 【1】MSL是Maximum Segment Lifetime报文最大生存时间…

root 用户和权限

目录 1. 超级管理员 root 2. 切换用户 Switch User 2.1 普通用户切换到 root 用户 2.2 root 用户切换到普通用户 3. sudo 命令 3.1 配置认证 无论是 Windows&#xff0c;MacOS&#xff0c;Linux 均采用多用户的管理模式管理权限&#xff1b; 1. 超级管理员 root 在 Li…

揭秘嵌入式系统设计:面试官常问的10个问题

面试官常问的问题 1 如何选择合适的微控制器&#xff1f; 问题背景&#xff1a; 微控制器是嵌入式系统的核心&#xff0c;选择合适的微控制器对整个系统的性能至关重要。 回答示例&#xff1a; 选择合适的微控制器需要考虑以下因素&#xff1a; 处理能力&#xff1a;根据系…

2年社招冲击字节,一天三面斩获offer

在工作满两年的时间选择了求变&#xff0c;带着运气和实力以社招身份重新看今天的互联网环境&#xff0c;从结果看还是复合预期的。 整个面试的流程还挺快的。周中让招聘专员给投递了简历。问什么时候面试&#xff0c;申请了一个周日&#xff0c;直接安排三面。下周周中就开启…

C#中的wpf基础

在WPF中&#xff0c;Grid 是一种非常强大的布局控件&#xff0c;用于创建网格布局。它允许你将界面划分为行和列&#xff0c;并将控件放置在这些行和列中。 以下是一些关键点和示例&#xff0c;帮助你理解 WPF 中的 Grid&#xff1a; 基本属性 RowDefinitions&#xff1a;定义…

[MIT6.5840]MapReduce

MapReduce Lab 地址 https://pdos.csail.mit.edu/6.824/labs/lab-mr.html 论文地址 https://static.googleusercontent.com/media/research.google.com/zh-CN//archive/mapreduce-osdi04.pdf 工作原理 简单来讲&#xff0c;MapReduce是一种分布式框架&#xff0c;可以用来处理…

windows 安装docker桌面版

下载 下载两个&#xff1a; git桌面版 docker desktop 启动docker 执行安装文件&#xff0c;启动 更新wsl2 假如报错&#xff0c;会提示失败原因。 win10会提示跳转到&#xff1a; https://learn.microsoft.com/zh-cn/windows/wsl/install-manual#step-4—download-the-l…

MySQL 事务与 MQ消息发送一致性

Transactional 事务中发送MQ消息&#xff0c;事务未提交但消息已经发送&#xff0c;会造成一些问题&#xff1a; 消息已发送&#xff0c;事务未提交&#xff0c;其他服务消费消息时回查数据库并未发现记录消息已发送&#xff0c;后面事务被回滚&#xff0c;但其他服务却已经收…

从0到1,AI我来了- (4)AI图片识别的理论知识-II

上篇文章&#xff0c;我们理解了我们程序的神经网络设计&#xff0c;这篇我们继续&#xff0c;把训练迭代过程分析一下&#xff0c;完成这两篇文章&#xff0c;下面问题&#xff0c;应该能回答了。 一张图片&#xff0c;如何被计算机读懂&#xff1f;pytorch 封装的网络&#…

MATLAB禁忌蚁群算法求解充电电动车辆路径规划EVRP代码实例

MATLAB禁忌蚁群算法求解充电电动车辆路径规划EVRP代码实例 MATLAB禁忌蚁群算法求解充电电动车辆路径规划EVRP代码实例

DP 整数拆分不同的二叉搜索树 DAY21

整数拆分&#xff1f; 给定一个正整数 n &#xff0c;将其拆分为 k 个 正整数 的和&#xff08; k > 2 &#xff09;&#xff0c;并使这些整数的乘积最大化。 返回 你可以获得的最大乘积。 示例 1: 输入: n 2 输出: 1 解释: 2 1 1, 1 1 1。示例 2: 输入: n 10 输…

全国区块链职业技能大赛样题第9套前端源码

后端源码地址:https://blog.csdn.net/Qhx20040819/article/details/140746050 前端源码地址:https://blog.csdn.net/Qhx20040819/article/details/140746216 智能合约+数据库表设计:https://blog.csdn.net/Qhx20040819/article/details/140746646 登录 ​ 用户管理

Unity Playables:下一代动画与音频序列

Unity的Playables API是一种灵活的系统&#xff0c;用于创建和控制动画、音频以及其他形式的连续媒体序列。它为开发者提供了一种全新的方法来处理游戏中的时间序列&#xff0c;包括动画、音频、特效等。本文将探讨Playables的基本概念、如何使用Playables API实现动画&#xf…

又一成就,Pencils Protocol单链 TVL 突破 3 亿美元

Pencils Protocol 是 Scroll 生态的原生项目&#xff0c;该项目以一站式收益聚合器和拍卖平台作为主要定位&#xff0c;在功能上&#xff0c;其集 Launchpad、资产统一聚合和分发、杠杆收益等功能于一体&#xff0c;旨在最大化用户的资产利用率。近日&#xff0c;Pencils Proto…

利用python自动化运维i脚本实现远程连接服务器并实现相应命令

目录 前言&#xff1a; 一.调用的python库介绍 二.在主机上安装好相应的库 2.1激活虚拟环境 三.代码实现以及解析 四.效果的实现 五.致谢 前言&#xff1a; 在当今快速发展的技术环境中&#xff0c;自动化运维已成为 IT 基础设施管理的关键组成部分。它不仅可以显著提…

大学生算法高等数学学习平台设计方案 (第一版)

目录 目标用户群体的精准定位 初阶探索者 进阶学习者 资深研究者 功能需求的深度拓展 个性化学习路径定制 概念图谱构建 公式推导展示 交互式问题解决系统 新功能和创新点的引入 虚拟教室环境 数学建模工具集成 算法可视化平台 学术论文资源库 技术实现的前瞻性…

PHP魔术常量

PHP 中的魔术常量&#xff08;Magic Constants&#xff09;是一组特殊的预定义常量&#xff0c;它们在脚本的任何时候都可用&#xff0c;并且它们的值会根据它们使用的上下文动态变化。这些常量在开发过程中非常有用&#xff0c;尤其是在需要根据当前环境或脚本位置动态改变行为…

Lua编程

文章目录 概述lua数据类型元表注意 闭包表现 实现 lua/c 接口编程skynet中调用层次虚拟栈C闭包注册表userdatalightuserdata 小结 概述 这次是skynet&#xff0c;需要一些lua/c相关的。写一篇博客&#xff0c;记录下。希望有所收获。 lua数据类型 boolean , number , string…