【C++算法】9.双指针_四数之和

devtools/2024/10/8 15:26:53/

文章目录

    • 题目链接:
    • 题目描述:
    • 解法
    • C++ 算法代码:
    • 图解


题目链接:

18.四数之和


题目描述:

1d9e7dd9cd71e7b5bc1afe93fc294f66


解法

解法一:排序+暴力枚举+利用set去重

解法二:排序+双指针

  1. 从左往右依次固定一个数a
  2. a后面的区间里,利用“三数之和”找到三个数,使这三个数的和等于target-a即可
  3. 在上面一步的“三数之和”里面,我们先固定一个b,在b后面的区间里面,利用“双指针”找到两个数,使这两个数的和等于target-a-b即可。

处理细节:

  1. 不重

    • 双指针要跳过相同元素
    • b要跳过相同元素
    • a要跳过相同元素
  2. 不漏

    双指针遇到合适的数继续往后走


C++ 算法代码:

class Solution 
{public:vector<vector<int>> fourSum(vector<int>& nums, int target) {vector<vector<int>> ret;// 1. 排序sort(nums.begin(), nums.end());// 2. 利用双指针解决问题int n = nums.size();for(int i = 0; i < n; ) // 固定数 a{// 利用 三数之和for(int j = i + 1; j < n; ) // 固定数 b{// 双指针int left = j + 1, right = n - 1;long long aim = (long long)target - nums[i] - nums[j];//aim = target - a - bwhile(left < right){int sum = nums[left] + nums[right];if(sum < aim) {left++;}else if(sum > aim) {right--;}else{ret.push_back({nums[i], nums[j], nums[left++], nums[right--]});//ret数组存放最终结果// 去重一while(left < right && nums[left] == nums[left - 1]) { left++;}while(left < right && nums[right] == nums[right + 1]) {right--;}}}// 去重二j++;while(j < n && nums[j] == nums[j - 1]) {j++;}}// 去重三i++;while(i < n && nums[i] == nums[i - 1]) {i++;}}return ret;}
};

图解

nums=[1,0,-1,0,-2,2]

target=0

  1. n=6,i=0,j=1,left=2,right=5,aim=-1

cc34bc0990edc6d3107deb9888d1802b

  1. left<right,sum=-1+2=1>aim,right--

8561104e892c6d5a435b7abae398630c

  1. left<right,sum=-1-2=-3<aim,left++

34a98b82163eb633d10ae3ed2a10f0d7

  1. left<right,sum=0-2=-2<aim,left++

  2. 不满足循环条件,跳出while循环,进入去重2j++

e4ce917585712b312259d149ca9e16ec

  1. n=6,i=0,j=2,left=3,right=5,aim=0

  2. 后面的步骤类似,就不多赘述了。


http://www.ppmy.cn/devtools/121635.html

相关文章

阿里云对象存储OSS 速学

目录 1.创建一个Bucket 2.创建密钥AccessKey 3.在文档中心打开阿里云对象存储OSS 4.参考上传文件示例 以官网的文档为主&#xff0c;我的文章教学为辅 官网有详细的视频介绍&#xff1a; OSS快速入门_对象存储(OSS)-阿里云帮助中心 (aliyun.com)https://help.aliyun.com/…

玄机:第五章 linux实战-黑链

简介 服务器场景操作系统 Linux 服务器账号密码 root xjty110pora 端口 2222 用 finalshell 连接 1. 找到黑链添加在哪个文件 flag 格式 flag{xxx.xxx} 查找文件中包含“黑链”的内容&#xff1b; grep -rnw /var/www/html/ -e 黑链-r&#xff1a;递归搜索。这个选项告诉 gre…

深蕾半导体Astra™ SL1620详细介绍,嵌入式物联网处理器

一&#xff0c;SL1620是什么 Astra™ SL系列是深蕾半导体推出的高度集成的嵌入式物联网处理器SoC&#xff08;System on Chip&#xff09;系列产品&#xff0c;专为多模式消费者、企业和工业物联网工作负载而设计。SL1620是Astra™ SL系列中的一款成本和功耗优化的安全嵌入式So…

更新-Python OS

更新日志&#xff08;2024-10-3 13:56&#xff09;&#xff1a; 此次更新主要是将按钮替换为图片&#xff0c;在观感上会更好看一些增添修改名称【change_app_name】函数&#xff0c;用于修改应用名称 相关代码&#xff1a; import os import tkinter as tk from tkinter i…

[网络]NAT、代理服务、内网穿透、内网打洞

目录 一、NAT 1.1 NAT 技术背景 1.2 NAT IP 转换过程 1.3 NAPT&#xff08;Network Address Port Translation&#xff09; 1.地址转换表 2. NAPT&#xff08;网络地址端口转换Network Address Port Translation&#xff09; 3. NAT技术的缺陷 二、代理服务器 2.1 正向…

银从初级个人理财_26_第七章第六节

一、单选题 下列各项中不属于理财规划方案的执行原则的是()。 了解原则 诚信原则 实事求是 连续性原则 理财师向客户提供持续的信息反馈、建议和专业指导意见&#xff0c;所遵循的原则是()&#xff0c; 连续性原则 了解原则 实事求是原则 诚信原则 理财&#xff0c;…

27 基于51单片机的方向盘模拟系统

目录 一、主要功能 二、硬件资源 三、程序编程 四、实现现象 一、主要功能 基于STC89C52单片机&#xff0c;采用两个MPX4115压力传感器作为两路压力到位开关电路&#xff0c; 采用滑动变阻器连接数模转换器模拟重力加速度传感器电路&#xff1b; 一个按键控制LED灯的点亮与…

向PHP传入参数的三种方法

向PHP传入参数是Web开发中常见的需求&#xff0c;它允许你的PHP脚本接收用户输入、处理数据并生成相应的输出。以下是三种主要的向PHP传入参数的方法&#xff0c;每种方法都有其特定的应用场景和优缺点。 方法一&#xff1a;通过URL参数&#xff08;GET请求&#xff09; 概述…