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

2024-01-06 21:20

本文主要是介绍两数之和 ? 三数之和? 四数之和? 统统搞定,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在这里插入图片描述

🎈个人主页:🎈 :✨✨✨初阶牛✨✨✨
🐻推荐专栏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.chinasem.cn/article/577646

相关文章

Spring AI集成DeepSeek三步搞定Java智能应用的详细过程

《SpringAI集成DeepSeek三步搞定Java智能应用的详细过程》本文介绍了如何使用SpringAI集成DeepSeek,一个国内顶尖的多模态大模型,SpringAI提供了一套统一的接口,简... 目录DeepSeek 介绍Spring AI 是什么?Spring AI 的主要功能包括1、环境准备2

Springboot的ThreadPoolTaskScheduler线程池轻松搞定15分钟不操作自动取消订单

《Springboot的ThreadPoolTaskScheduler线程池轻松搞定15分钟不操作自动取消订单》:本文主要介绍Springboot的ThreadPoolTaskScheduler线... 目录ThreadPoolTaskScheduler线程池实现15分钟不操作自动取消订单概要1,创建订单后

MySQL数据库宕机,启动不起来,教你一招搞定!

作者介绍:老苏,10余年DBA工作运维经验,擅长Oracle、MySQL、PG、Mongodb数据库运维(如安装迁移,性能优化、故障应急处理等)公众号:老苏畅谈运维欢迎关注本人公众号,更多精彩与您分享。 MySQL数据库宕机,数据页损坏问题,启动不起来,该如何排查和解决,本文将为你说明具体的排查过程。 查看MySQL error日志 查看 MySQL error日志,排查哪个表(表空间

两数之和--力扣1

两数之和 题目思路C++代码 题目 思路 根据题目要求,元素不能重复且不需要排序,我们这里使用哈希表unordered_map。注意题目说了只对应一种答案。 所以我们在循环中,使用目标值减去当前循环的nums[i],得到差值,如果我们在map中能够找到这个差值,就说明存在两个整数的和为目标值。 如果没有找到,就将当前循环的nums[i]以及下标i放入map中,以便后续查

分享5款免费录屏的工具,搞定网课不怕错过!

虽然现在学生们不怎么上网课, 但是对于上班族或者是没有办法到学校参加课程的人来说,网课还是很重要的,今天,我就来跟大家分享一下我用过的几款录屏软件=,看看它们在录制网课时的表现如何。 福昕录屏大师 网址:https://www.foxitsoftware.cn/REC/ 这款软件给我的第一印象就是界面简洁,操作起来很直观。它支持全屏录制,也支持区域录制,这对于我这种需要同时录制PPT和老师讲

快速搞定“照片调色”!50000+Lr预设滤镜模板,一键让你照片不再丑!

照片调色不仅仅是调整颜色,更是一种艺术表达。通过巧妙地运用 LR 预设,可以突出照片的主题,增强情感共鸣。比如,在风景照片中,使用特定的预设可以让天空更蓝、草地更绿,让大自然的美丽更加生动地展现出来。 在人像摄影中,合适的 LR 预设可以让肤色更加自然、眼神更加明亮,让人物更加迷人。而且,LR 预设还可以根据不同的风格和场景进行定制,满足各种个性化的需求。如果你对照片调色还不是

Leetcode面试经典150题-2.两数相加

解法都在代码里,不懂就留言或者私信 理论上提交这个就是最优解 字节考过不下20次,这个高居字节面试榜第9名 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode() {}* ListNode(int val) {

两步搞定 Tomcat 下启用 https:// 访问

这个简单教程中我们通过简单的两步就可以在 Tomcat 7 中启用 HTTPS 访问。 第一步:创建 .keystore 文件 使用如下命令生成 .keystore 文件 windows : 1 %JAVA_HOME%\bin\keytool -genkey -alias tomcat -keyalg RSA Linux: 1 $JAVA_HOM

【LeetCode】最接近的三数之和

题目要求 解题思路 这道题解题方法和三数之和解题思路一样,可以参考上一篇博客 代码实现 class Solution {public:int threeSumClosest(vector<int>& nums, int target) {//排序sort(nums.begin(),nums.end());int len=nums.size();//固定一个,利用双指针解决int c

第十八题:四数之和

题目描述 给定一个包含 n 个整数的数组 nums 和一个目标值 target,找出 nums 中的四个整数,使得它们的和等于 target。你可以假设每个输入都只有一个解决方案,并且不能使用同一个元素多次。 实现思路 采用排序加双指针的方法来解决这个问题。首先对数组进行排序,然后遍历数组,对于每一个元素,设定一个新的目标值为原目标值减去这个元素的值,再利用三数之和的解法找到剩下的三个数。为