两数之和 ? 三数之和? 四数之和? 统统搞定

在这里插入图片描述

🎈个人主页:🎈 :✨✨✨初阶牛✨✨✨
🐻推荐专栏1: 🍔🍟🌯C语言初阶
🐻推荐专栏2: 🍔🍟🌯C语言进阶
🔑个人信条: 🌵知行合一

前言

声明:题目来源于: 力扣

目录

  • 前言
  • 一、查找总价格为目标值的两个商品
    • (1) 题目描述
      • 示例
    • (2)解题思路
    • (3)代码展示:
  • 二、三数之和
    • (1) 题目描述
      • 示例
    • (2)解题思路
    • (3)代码展示:
  • 三、四数之和
    • (1) 题目描述
      • 示例:
    • (2)解题思路
    • (3)代码展示:

一、查找总价格为目标值的两个商品

题目链接:传送门

(1) 题目描述

购物车内的商品价格按照升序记录于数组 price。请在购物车中找到两个商品的价格总和刚好是 target。若存在多种情况,返回任一结果即可。

示例

示例 1:

输入:price = [3, 9, 12, 15], target = 18
输出:[3,15] 或者 [15,3]

示例 2:

输入:price = [8, 21, 27, 34, 52, 66], target = 61
输出:[27,34] 或者 [34,27]

(2)解题思路

  1. 定义双指针,left指向最开始的元素,right指向最后一个元素。
    在这里插入图片描述

  2. 如果left+right>target
    在这里插入图片描述
    则我们将右指针向前移动,因为数据是有序的,所以移动右指针,left+right减小
    在这里插入图片描述

  3. 如果left+right<target(如上图)
    则我们将左指针向前移动,因为数据是有序的,所以移动左指针,left+right增大

  4. 循环2、3操作,直到找到left+right=target。

  5. 返回leftright

(3)代码展示:

class Solution {
public:vector<int> twoSum(vector<int>& price, int target) {int left=0,right=price.size()-1;vector<int> v(2);while(left<right){//如果left+right>targetif(price[left]+price[right]>target){right--;}如果left+right<targetelse if(price[left]+price[right]<target){left++;}else{	//表明//如果left+right=target,可以返回了v[0]=price[left];v[1]=price[right];break;}}return v;}
};

二、三数之和

题目链接:传送门

(1) 题目描述

给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i != j、i != k 且 j != k ,同时还满足 nums[i] + nums[j] + nums[k] == 0 。请你返回所有和为 0 且不重复的三元组。

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

示例

示例 1:
输入:nums = [-1,0,1,2,-1,-4]
输出:[[-1,-1,2],[-1,0,1]]

解释:

nums[0] + nums[1] + nums[2] = (-1) + 0 + 1 = 0 。
nums[1] + nums[2] + nums[4] = 0 + 1 + (-1) = 0 。
nums[0] + nums[3] + nums[4] = (-1) + 2 + (-1) = 0 。
不同的三元组是 [-1,0,1] 和 [-1,-1,2] 。
注意,输出的顺序和三元组的顺序并不重要。

示例 2:

输入:nums = [0,1,1]
输出:[]

解释:唯一可能的三元组和不为 0 。

示例 3:

输入:nums = [0,0,0]
输出:[[0,0,0]]

解释:唯一可能的三元组和为 0 。

(2)解题思路

  1. 为了让我们更好的寻找数,排序是有利于提高我们的查找效率的。
  2. 要找到3个数的和为0,我们只需要固定一个数(end),然后找到两个数的和为-end即可。
  3. 初始化end指针,使其指向最后一个元素
    寻找两个数的和为-end
    (1)初始化left使其指向第一个元素。
    (2)初始化right,使其指向end的前一个元素。
    4 .看到这里,应该不难知道,如何寻找寻找两个数的和为-end ,这不就是第一道题的要求吗?
  4. 如果left>right,表明end为前面的所有可能都已经统计过了,end往前移动一步,继续2、3步骤。

注意:
每次移动leftright包括end的时候,由于我们不能出现互不相同的三元组,所以我们需要跳过相同的元素。

(3)代码展示:

class Solution {
public:vector<vector<int>> threeSum(vector<int>& nums) {vector<vector<int>> vv1;sort(nums.begin(), nums.end());	//先对数据进行排序int end = nums.size() - 1;		//end从最后一个元素开始查起while (end >= 2) {int right = end - 1;int left = 0;//找两个数while (left < right) {if ((nums[left] + nums[right]) == -nums[end]) {//找到以后vector<int> v1 = { nums[left],nums[right],nums[end] };vv1.push_back(v1);left++, right--;//都要跳过重复元素while (left  < right && nums[left] == nums[left - 1]) left++;while (left < right && nums[right] == nums[right + 1]) right--;}if ((nums[left] + nums[right]) > -nums[end]) right--;else if ((nums[left] + nums[right]) < -nums[end])left++;}//end也要跳过重复元素end--;while (end - 1 > 0 && nums[end] == nums[end + 1]) end--;}return vv1;}
};

三、四数之和

题目链接:传送门

(1) 题目描述

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

0 <= a, b, c, d < n
a、b、c 和 d 互不相同 (牛牛提醒一下,这里abcd是下标,而不是数组中的值)
nums[a] + nums[b] + nums[c] + nums[d] == target
你可以按 任意顺序 返回答案 。

示例:

示例 1:

输入:nums = [1,0,-1,0,-2,2], target = 0
输出:[[-2,-1,1,2],[-2,0,0,2],[-1,0,0,1]]

示例 2:

输入:nums = [2,2,2,2,2], target = 8
输出:[[2,2,2,2]]

(2)解题思路

牛牛讲不动了,相信大家可以自己写出来的。
在这里插入图片描述

如果直接写第四题,我们可能无法下手,但是有了前两个的铺垫,现在写应该不算太困难了。

秘诀:
四数之和转化为三数之和
三数之和转化为两数之和

(3)代码展示:

class Solution {
public:vector<vector<int>> fourSum(vector<int>& nums, int target) {vector<vector<int>> vv1;sort(nums.begin(), nums.end());int d = nums.size() - 1;while (d >= 3) {int c=d-1;//找三个数while(c>=2){int a=0,b=c-1;//找两个数while (a < b) {//找到以后if (((long long )nums[a] + nums[b]+nums[c]+nums[d]) == (long long)target) {vector<int> v1 = { nums[a],nums[b],nums[c],nums[d] };vv1.push_back(v1);a++, b--;while (a  < b && nums[a] == nums[a - 1]) a++;while (a < b && nums[b] == nums[b + 1]) b--;}if ((long long )(nums[a] + nums[b]) > (long long)target-nums[d]-nums[c]) b--;else if ((long long )(nums[a] + nums[b]) < (long long )target-nums[d]-nums[c])a++;}c--;while (c  > 0 && nums[c] == nums[c + 1]) c--;}d--;while (d  > 0 && nums[d] == nums[d + 1]) d--;}return vv1;}
};

好了,今天的算法题就到这里了,我们下次见!
在这里插入图片描述

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

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

相关文章

useContext

可以跨组件传值 其实主要的就是三步 1、const xxx React.createContext();创建一个context 2、<xxx.Provider value{{ num, setNum }}>父组件设置要传递的值 3、const { num, setNum } React.useContext(xxx);子组件下使用 特点&#xff1a; 1、可以有多个xxx.Pr…

【数字图像处理技术与应用】2023-2024上图像处理期中-云南农业大学

一、填空题&#xff08;每空2 分&#xff0c;共 30 分&#xff09; 1、图像就是3D 场景在 二维 平面上的影像&#xff0c;根据其存储方式和表现形式&#xff0c;可以将图像分为 模拟 图像和数字图像两大类&#xff1b; 2、在用计算机对数字图像处理中&#xff0c;常用一个 二…

全国(山东、安徽)职业技能大赛--信息安全管理与评估大赛题目+答案讲解——2023年国赛模拟题-linux应急响应

🍬 博主介绍👨‍🎓 博主介绍:大家好,我是 hacker-routing ,很高兴认识大家~ ✨主攻领域:【渗透领域】【应急响应】 【python】 【VulnHub靶场复现】【面试分析】 🎉点赞➕评论➕收藏 == 养成习惯(一键三连)😋 🎉欢迎关注💗一起学习👍一起讨论⭐️一起进步…

MATLAB - MPC - 优化问题(Optimization Problem)

系列文章目录 前言 模型预测控制可在每个控制间隔内解决一个优化问题&#xff0c;具体来说就是二次规划(QP)。求解结果决定了被控对象在下一个控制间隔之前使用的操纵变量&#xff08;MV&#xff09;。 该 QP 问题具有以下特点&#xff1a; 目标或 "成本 "函数 - …

数据结构(JS实现)

目录 链表链表的特点链表中的常见操作单链表append(data)尾部追加新节点toString()输出链表的节点数据插入节点insert(position,data)get(position)获取链表指定位置节点的数据indexOf(data)查找对应数据节点的位置update(position, newData)更新指定位置节点数据removeAt(posi…

【STM32】STM32学习笔记-ADC单通道 ADC多通道(22)

00. 目录 文章目录 00. 目录01. ADC简介02. ADC相关API2.1 RCC_ADCCLKConfig2.2 ADC_RegularChannelConfig2.3 ADC_Init2.4 ADC_InitTypeDef2.5 ADC_Cmd2.6 ADC_ResetCalibration2.7 ADC_GetResetCalibrationStatus2.8 ADC_StartCalibration2.9 ADC_GetCalibrationStatus2.10 A…

197.【2023年华为OD机试真题(C卷)】执行时长(模拟题-JavaPythonC++JS实现)

🚀点击这里可直接跳转到本专栏,可查阅顶置最新的华为OD机试宝典~ 本专栏所有题目均包含优质解题思路,高质量解题代码(Java&Python&C++&JS分别实现),详细代码讲解,助你深入学习,深度掌握! 文章目录 一. 题目-执行时长二.解题思路三.题解代码Python题解代码…

前端接收后端传的文件流并下载解决乱码问题

因项目需求手写了一个导出&#xff0c;但是前端获取时出现了乱码&#xff0c;搜到一下解决方案&#xff1a; 两种情况&#xff1a; 1.如果这个接口是get的请求&#xff1a; 后端返回文件流&#xff0c;前端可能会导出txt或者excel的时候&#xff0c;里面的中文会出现乱码文章…

java 音乐会售票平台系统Myeclipse开发mysql数据库struts2结构java编程计算机网页项目

一、源码特点 java 音乐会售票平台系统 是一套完善的web设计系统&#xff0c;对理解JSP java编程开发语言有帮助struts2框架开发mvc模式&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发 环境为TOCAT7.0,Myeclipse8.5开发&#xff0c;数据…

【投稿优惠|优质会议】2024年材料化学与清洁能源国际学术会议(IACMCCE 2024)

【投稿优惠|优质会议】2024年材料化学与清洁能源国际学术会议(IACMCCE 2024) 2024 International Conference Environmental Engineering and Mechatronics Integration(ICEEMI 2024) 一、【会议简介】 随着全球能源需求的不断增长&#xff0c;清洁能源的研究与应用成为了国际…

三叠云流程制造ERP:构建智慧工厂,实现高效生产管理

在数字化经济的浪潮下&#xff0c;新一代信息技术快速发展&#xff0c;深度整合&#xff0c;引领了工业的创新和变革&#xff0c;推动了企业向智能化发展。解决生产管理、销售管理和技术管理等难题的关键&#xff0c;在于管理者能否及时准确地掌握企业运营信息。三叠云流程制造…

读书之深入理解ffmpeg_简单笔记2(初步)

再回看第一遍通读后的笔记&#xff0c;感觉还有很多的细节需要一一攻克,。 mp4的封装格式&#xff0c;解析方式。 flv的封装格式&#xff0c;解析方式。 ts的封装格式&#xff0c;解析方式。 第四章 封装和解封装 4.2 视频文件转flv &#xff08;头文件和文件内容&#xff0…

Django发送QQ邮件

创建一个表单&#xff0c;供用户填写他们的姓名和电子邮件、电子邮件收件人和可选的注释 创建blog/forms.py from django import formsclass EmailPostForm(forms.Form):name forms.CharField(max_length25)email forms.EmailField()to forms.EmailField()comments forms.…

【ARMv8架构系统安装PySide2】

ARMv8架构系统安装PySide2 Step1. 下载Qt资源包Step2. 配置和安装Qt5Step3. 检查Qt-5.15.2安装情况Step4. 安装PySide2所需的依赖库Step5. 下载和配置PySide2Step6. 检验PySide2是否安装成功 Step1. 下载Qt资源包 if you need the whole Qt5 (~900MB): wget http://master.qt…

密码学(一)

文章目录 前言一、Cryptographic Primitives二、Cryptographic Keys2.1 Symmetric key cryptography2.2 asymmetric key cryptography 三、Confidentiality3.1 Symmetric key encryption algorithms3.2 asymmetric key block ciphers3.3 其他 四、Integrity4.1 symmetric key s…

【C程序设计】C数组

C 语言支持数组数据结构&#xff0c;它可以存储一个固定大小的相同类型元素的顺序集合。数组是用来存储一系列数据&#xff0c;但它往往被认为是一系列相同类型的变量。 数组的声明并不是声明一个个单独的变量&#xff0c;比如 runoob0、runoob1、...、runoob99&#xff0c;而…

Python从入门到网络爬虫(文件I/O详解)

Python提供了强大而灵活的文件I/O&#xff08;输入/输出&#xff09;工具&#xff0c;能够读取、写入和处理各种文件类型。本文将深入介绍Python文件I/O的技巧和示例代码&#xff0c;帮助大家更好地理解如何在Python中处理文件。 打开文件 在Python中&#xff0c;可以使用open…

【安全篇 / FortiGuard】(7.4) ❀ 01. FortiGuard服务到期后会怎么样?❀ FortiGate 防火墙

【简介】很多企业为了网络的安全&#xff0c;都会购买FortiGuard服务&#xff0c;但是FortiGuard服务都是有期限的&#xff0c;由于各种原因&#xff0c;企业在超过服务期限后没有继续购买FortiGuard服务&#xff0c;那么会出现什么情况&#xff1f;防火墙还能继续工作吗&#…

61.网游逆向分析与插件开发-游戏增加自动化助手接口-游戏红字公告功能的逆向分析

内容来源于&#xff1a;易道云信息技术研究院VIP课 上一节内容&#xff1a;游戏公告功能的逆向分析与测试-CSDN博客 码云地址&#xff08;master分支&#xff09;&#xff1a;https://gitee.com/dye_your_fingers/sro_-ex.git 码云版本号&#xff1a;63e04cc40f649d10ba2f4f…

【卡梅德生物】制备兔单抗常见问题及解决方法

在制备兔单抗的过程中&#xff0c;可能会遇到一些常见问题&#xff0c;以下是一些可能的问题和相应的解决方法&#xff1a; 1、低抗体产量&#xff1a; 问题原因&#xff1a;免疫兔子后&#xff0c;可能出现抗体产量较低的情况。 解决方法&#xff1a;提高抗原免疫方案、增加…