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

在这里插入图片描述

🎈个人主页:🎈 :✨✨✨初阶牛✨✨✨
🐻推荐专栏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>target
            if(price[left]+price[right]>target){
                right--;
            }如果left+right<target
            else 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.mfbz.cn/a/296628.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

高性价比LDR6028Type-C转3.5mm音频和PD快充转接器

随着市面上的大部分手机逐渐取消了3.5mm音频耳机接口&#xff0c;仅保留一个Type-C接口&#xff0c;追求音质和零延迟的用户面临着一大痛点。对于这些用户&#xff0c;Type-C转3.5mm接口线的出现无疑是一大福音。这款线材在刚推出时就受到了手机配件市场的热烈欢迎&#xff0c;…

Python武器库开发-武器库篇之子域名扫描器开发(四十一)

Python武器库开发-武器库篇之子域名扫描器开发(四十一) 在我们做红队攻防或者渗透测试的过程中&#xff0c;信息收集往往都是第一步的&#xff0c;有人说&#xff1a;渗透的本质就是信息收集&#xff0c;前期好的信息收集很大程度上决定了渗透的质量和攻击面&#xff0c;本文将…

AI数字人国内人工智能产业发展趋势

随着科技的不断进步&#xff0c;人工智能&#xff08;Artificial Intelligence&#xff0c;简称AI&#xff09;已成为当今社会的热门话题。作为一种复杂而高级的技术&#xff0c;人工智能在国内发展势头迅猛。本文将探讨AI数字人国内人工智能产业的发展趋势。 首先&#xff0c…

科锐16位汇编学习笔记01汇编基础和debug使用

为什么学习16位汇编&#xff1f; 16位操作指令最多能够操作两个字节&#xff0c;且更能够体现出与硬件的交互。16位下的指令和32位汇编的指令差不多。16位汇编的指令在32位一样使用.要学好汇编必须要了解一点点硬件知识,16汇编是直接操作硬件,32位汇编指令跟硬件隔离了 硬件运…

simulink代码生成(六)——中断向量模块的配置

假如系统中存在多个中断&#xff0c;需要合理的配置中断的优先级与中断向量表&#xff1b;在代码生成中&#xff0c;要与中断向量表对应&#xff1b;中断相关的知识参照博客&#xff1a; DSP28335学习——中断向量表的初始化_中断向量表什么时候初始化-CSDN博客 F28335中断系…

目标检测-One Stage-YOLOv2

文章目录 前言一、YOLOv2的网络结构和流程二、YOLOv2的创新点预处理网络结构训练 总结 前言 根据前文目标检测-One Stage-YOLOv1可以看出YOLOv1的主要缺点是&#xff1a; 和Fast-CNN相比&#xff0c;速度快&#xff0c;但精度下降。&#xff08;边框回归不加限制&#xff09;…

24年初级会计资格考试报名信息采集流程共10大步骤,千万不要搞错

2024年初级会计资格考试报名信息采集流程共10大步骤&#xff0c;不要搞错哦&#xff1b; 第一步&#xff1a;输入证件号、点击登录 第二步&#xff1a;阅读采集须知 第三步&#xff1a;填写个人信息&#xff08;支付宝搜索"亿鸣证件照"或者微信搜索"随时照&q…

uniapp 日历组件

我们的需求是显示当前月和下个月的排班表 引入 uniapp 日历组件 uni-calendar 做法有两种&#xff0c;一种是直接去修改组件&#xff0c;还有就是文档中提供的 selected 方法 修改组件的就不写了 <uni-calendar :lunar"true" :selected"selected" :in…

2023 hnust 湖南科技大学 大四上 计算机图形图像技术 课程 期末考试 复习资料

计算机图形图像技术复习资料 前言 改编自&#xff1a;https://blog.csdn.net/Liu_Xin233/article/details/135232531★重点&#xff0c;※补充github 考试题型 简述题&#xff08;10分4题&#xff0c;共40分&#xff09; 第1章的基本内容三维观察流水线中的基本概念与理解三…

使用Python给图片加水印(通过OpenCV和Pillow实现,内含完整代码链接)

from PIL import Image, ImageFont, ImageDraw, ImageEnhance, ImageChops import cv2 import math import numpy as npdef crop_image(im):"""裁剪图片边缘空白"""bg Image.new(mode"RGBA", sizeim.size)bbox ImageChops.differenc…

ASPICE4.0标准参考模型

aspice4.0 已经发布了&#xff0c;最近正在规划公司开发流程向4.0升级&#xff0c;研究对比了下4.0和3.1的改变&#xff0c;整体来说4.0减少了很多3.1不实用的过程&#xff0c;增加了硬件过程&#xff0c;机器学习过程&#xff0c;过程细节叶更加贴近项目的实际需求&#xff0c…

【Python特征工程系列】教你利用逻辑回归模型分析特征重要性(源码)

这是Python特征工程系列原创文章&#xff0c;我的第191篇原创文章。 一、问题 应用背景介绍&#xff1a; 如果有一个包含数十个甚至数百个特征的数据集&#xff0c;每个特征都可能对你的机器学习模型的性能有所贡献。但是并不是所有的特征都是一样的。有些可能是冗余的…

【年终总结系列 2023】新起点,同时追寻更高的起点

什么是攀登者&#xff0c;用一个场景来概括就是&#xff1a;经常弯腰低头手脚并用向上攀爬&#xff0c;待到山的顶峰后终于可以舒展一下身体&#xff0c;但若舒展的时间过长便会觉得无聊&#xff0c;此时向远处眺望&#xff0c;发现了更高的山峰&#xff0c;便又充满了激情。对…

上门洗车小程序开发源码,预约上门或到店洗车

预约上门洗车小程序&#xff0c;可以预约上门服务&#xff0c;也可以预约到店洗车&#xff0c;可以在线开通会员&#xff0c;领优惠券&#xff0c;分销推广。门店商家端可以管理订单&#xff0c;查看收益。 该系统分为三个端&#xff1a;用户端、商家端、管理后台。 一 用户端…

数据结构 模拟实现Stack栈(数组模拟)

目录 一、栈的概念 二、栈的接口 三、栈的方法实现 &#xff08;1&#xff09;push方法 &#xff08;2&#xff09;pop方法 &#xff08;3&#xff09;peek方法 &#xff08;4&#xff09;size方法 ​编辑 &#xff08;5&#xff09;empty方法 四、最终代码 一、栈的…

我们公司内应届生身上的6个共性问题

如题目&#xff0c;本文主要是根据我们公司内真实的应届生身上共同的问题&#xff0c;总结而来。 1. 一天会做很多工作&#xff1a;会跟很多人对接&#xff0c;会一会忙这个一会忙哪个 现象&#xff1a; 说实话&#xff0c;这种情况&#xff0c;我看着都替她着急。自己正在解…

【2058错误】sql软件链接数据库 mysql 报错误2058

【2058错误】sql软件链接数据库报错误2058 操作&#xff1a;仅需在mysql登陆之后运行一行代码即可&#xff1a;注意1.后面必须是%&#xff0c;而不是别人说的 localhost2.此处的password是你自己的mysql密码。 操作&#xff1a;仅需在mysql登陆之后运行一行代码即可&#xff1a…

jQuery页面整屏滚动

效果展示 jQuery页面整屏滚动 Html代码块 <div id"fullpage" class"fullpage-index"><!-- index01 --><div class"indexitem index01 section" id"#page1"><img src"img/img01.jpg"/></div>…

关于kthread_stop的疑问(linux3.16)

线程一旦启动起来后&#xff0c;会一直运行&#xff0c;除非该线程主动调用do_exit函数&#xff0c;或者其他的进程调用kthread_stop函数&#xff0c;结束线程的运行。 之前找销毁内核线程的接口时&#xff0c;发现了kthread_stop这个接口。网上说这个函数能够销毁一个内核线程…

124 二叉树中的最大路径和

又是一个hard题目&#xff0c;其实我大概有想到要去dfs遍历节点&#xff0c;当时不知道怎么从一个叶子结点开始遍历。其实只需要从根节点出发&#xff0c;看看左右节点加在一起是否最大能不能作为一个路径&#xff0c;但是对外这是要不左节点上来要不右节点上来&#xff0c;不能…
最新文章