当前位置: 首页 > news >正文

【OJ刷题】双指针问题6

这里是阿川的博客,祝您变得更强

✨ 个人主页:在线OJ的阿川
💖文章专栏:OJ刷题入门到进阶
🌏代码仓库:


写在开头

现在您看到的是我的结论或想法但在这背后凝结了大量的思考、经验和讨论


在这里插入图片描述

在这里插入图片描述

目录

  • 1. 题目介绍
  • 2. 题目拆解
  • 3. 具体详情
  • 4. 具体代码


1. 题目介绍

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

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

你可以按 任意顺序 返回答案 。
举个例子: 具体如图1所示
在这里插入图片描述

图1 举个例子

2. 题目拆解

本质上:观察规律,双指针遍历判断
特点是:在组合搭配中有一定规律
解决方法:双指针算法,如图2所示
在这里插入图片描述

图2 双指针

3. 具体详情

1. 先进行排序
2. 依次固定一个数并确保固定时,若是重复固定值时跳过
3. 在固定数后面的区间内利用"三数之和"找到三个数,然后再固定一个数,在固定的这个数后面的区间内,利用"双指针"找到两个数,使这两个数的和等于目标值减去两个固定值并遍历完整个数组,并确保当双指针和固定值是重复值时跳过
4. 最后返回数组


4. 具体代码

class Solution {
public:vector<vector<int>> fourSum(vector<int>& nums, long long target){// 进行排序sort(nums.begin(), nums.end());vector<vector<int>> cur;int n = nums.size();// 第1层固定值for(int i = 0; i < n; ){// 第2层固定值for(int j = i + 1; j < n; ){int left = j + 1, right = n - 1;long long aim = target - nums[i] - nums[j];// 双指针算法具体实现while(left < right){int sum = nums[left] + nums[right];// 三种情况if(sum > aim) right--;else if(sum < aim) left++;else{cur.push_back({nums[i], nums[j], nums[left++], nums[right--]});// 去重while(left < right && nums[left] == nums[left - 1]) left++;while(left < right && nums[right] == nums[right + 1]) right--;}}j++;// 第2层固定值去重while(j < n && nums[j] == nums[j - 1]) j++;}i++;// 第1层固定值去重while(i < n && nums[i] == nums[i - 1]) i++;}return cur;}
};

5. 夹带私货

若你能看到看到这篇文章且能看到这,则说明你我有缘留个关注吧,后面还会接着计算机408、底层原理、开源项目、以及数据、后端研发相关、实习、笔试/面试、秋招/春招、各种竞赛相关、简历相关、考研、学术相关……,祝你我变得更强


好的,到此为止啦,祝您变得更强
在这里插入图片描述

在这里插入图片描述

道阻且长 行则将至
个人主页:在线OJ的阿川大佬的支持和鼓励,将是我成长路上最大的动力 在这里插入图片描述

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • pWnOS的第二种全新解法(ssh私钥破解、webmin漏洞提权)
  • C++3D迷宫
  • opencv之图像梯度
  • # wps必须要登录激活才能使用吗?
  • Java多线程2
  • 开发板与ubuntu建立网络通信(NFS和TFTP协议搭建)
  • 【GESP】C++一级练习BCQM3006,多行输出
  • MySQL——数据库的高级操作(三)权限管理(4)收回权限
  • JUC学习笔记(一)
  • android 老项目中用到的jar包不存在,通过离线的方法加载
  • 【C/C++】程序的构建(编译)过程概述
  • PyAutoGUI:自动化操作的强大工具
  • 【Android Studio】app:compileDebugJavaWithJavac FAILED解决办法
  • c++类型转换
  • GoPlantUML,go代码到类图
  • 《Javascript高级程序设计 (第三版)》第五章 引用类型
  • Angular 2 DI - IoC DI - 1
  • css系列之关于字体的事
  • golang 发送GET和POST示例
  • Java 9 被无情抛弃,Java 8 直接升级到 Java 10!!
  • 分享几个不错的工具
  • 计算机常识 - 收藏集 - 掘金
  • 聚簇索引和非聚簇索引
  • 码农张的Bug人生 - 初来乍到
  • 前端代码风格自动化系列(二)之Commitlint
  • 前嗅ForeSpider中数据浏览界面介绍
  • 为物联网而生:高性能时间序列数据库HiTSDB商业化首发!
  • 一些css基础学习笔记
  • 一些关于Rust在2019年的思考
  • mysql面试题分组并合并列
  • ​2021半年盘点,不想你错过的重磅新书
  • ​无人机石油管道巡检方案新亮点:灵活准确又高效
  • ​学习笔记——动态路由——IS-IS中间系统到中间系统(报文/TLV)​
  • #pragma once与条件编译
  • (39)STM32——FLASH闪存
  • (笔试题)分解质因式
  • (博弈 sg入门)kiki's game -- hdu -- 2147
  • (超简单)构建高可用网络应用:使用Nginx进行负载均衡与健康检查
  • (附源码)python旅游推荐系统 毕业设计 250623
  • (附源码)ssm码农论坛 毕业设计 231126
  • (附源码)计算机毕业设计SSM智能化管理的仓库管理
  • (官网安装) 基于CentOS 7安装MangoDB和MangoDB Shell
  • (六)什么是Vite——热更新时vite、webpack做了什么
  • (欧拉)openEuler系统添加网卡文件配置流程、(欧拉)openEuler系统手动配置ipv6地址流程、(欧拉)openEuler系统网络管理说明
  • (五)Python 垃圾回收机制
  • (一) storm的集群安装与配置
  • (一)SvelteKit教程:hello world
  • (转)Scala的“=”符号简介
  • (转)shell调试方法
  • .htaccess 强制https 单独排除某个目录
  • .NET Conf 2023 回顾 – 庆祝社区、创新和 .NET 8 的发布
  • .NET Core WebAPI中使用swagger版本控制,添加注释
  • .net core 调用c dll_用C++生成一个简单的DLL文件VS2008
  • .NET 使用 JustAssembly 比较两个不同版本程序集的 API 变化
  • .net 使用$.ajax实现从前台调用后台方法(包含静态方法和非静态方法调用)