算法——双指针(day4)

15.三数之和

 

15. 三数之和 - 力扣(LeetCode) 

题目解析:

这道题目说是三数之和,其实这和我们之前做过的两数之和是一个规律的~无非就是我们需要实时改动target的值。先排好序,然后固定一个数取其负值作target,然后我们再从除固定数以外的范围内寻找两数之和为target的数,这样再与固定数相加就得到0了,形成三元数组。

 

算法解析:

这就是两数和的核心图解,唯一区别就是我们的target值是随着固定数的变化而发生改变的~

废话不多说,本题的难点就在于去重以及去重时的越界问题。因为按照题目规定类似于

【-1,0,-1】与【-1,-1,0】这种会算重复项只能取其一,而这也是我们优先选择排序的原因,在排行序后二者就变为【-1,-1,0】,更容易去重。

去重分两个阶段,一是【left,right】范围之间的去重,另一个是固定数first遍历数组的去重。

所以我们给出的去重方案就是观察移动前后的数值是否相同,如果相同那就再移动一位,直到不同为止。不过这样也引发了新的问题:越界~

 

我们发现left与right的选取是需要在【left,rigtht】这个界限里面的所以只需要加上一层条件即可(left<right)~

 固定数first同理:

代码: 


class Solution {
public:vector<vector<int>> threeSum(vector<int>& nums) {vector<vector<int>> ret;sort(nums.begin(), nums.end());int n = nums.size();int first = 0;while (first <= n - 3){//小优化if (nums[first] > 0) break;int left = first + 1;int right = n - 1;int target = -nums[first];//一轮比较while (left < right){int sum = nums[left] + nums[right];if (sum > target){--right;}else if (sum < target){++left;}else{ret.push_back({ nums[first],nums[left],nums[right] });right--;left++;//left与right去重while (left < right && nums[right + 1] == nums[right]){right--;}while (left < right && nums[left - 1] == nums[left]){left++;}}}//固定数去重first++;while (first < n && nums[first - 1] == nums[first]){first++;}}return ret;}
};

18.四数之和

18. 四数之和 - 力扣(LeetCode)

题目解析:

四数之和别看多了一个数,其实和三数之和还是同一个模板,没有本质区别

算法解析:

 

找四数之和我们可以先拆分成固定数a与三数之和,那么三数之和的值就得为target-a。这样a与三数之和才相加才可以变为target,而在三数之和中就得拆分成固定数b与两数之和,那么两数之和的值就得为target-a-b,这样才能与b相加得到target-a。

所以只要在三数之和的代码中把控好target-a-b的值就行了,除此之外再多加一个对固定数a的去重就好了~

 代码:

在三数之和外套一层固定数a的循环以及去重复,另外改变目标值t变为target-a-b就差不多了。


class Solution {
public:vector<vector<int>> fourSum(vector<int>& nums, int target) {vector<vector<int>> ret;sort(nums.begin(), nums.end());int n = nums.size();int a = 0;//固定数awhile (a <= n - 4){//固定数bint b = a + 1;while (b <= n - 3){int left = b + 1;int right = n - 1;//防止数据溢出强转类型long long t = (long long)target - nums[b] - nums[a];while (left < right){int sum = nums[left] + nums[right];if (sum > t){--right;}else if (sum < t){++left;}else{ret.push_back({ nums[a],nums[b],nums[left],nums[right] });right--;left++;//一级去重复while (left < right && nums[right + 1] == nums[right]){right--;}while (left < right && nums[left - 1] == nums[left]){left++;}}}//二级去重b++;while (b < n && nums[b - 1] == nums[b]){b++;}}//三级去重a++;while (a < n && nums[a - 1] == nums[a]){a++;}}return ret;}
};

 

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

Django select_related()方法

select_related()的作用 select_related()是Django ORM&#xff08;对象关系映射&#xff09;中的一种查询优化方法&#xff0c;主要用于减少数据库查询次数&#xff0c;提高查询效率。当你在查询一个模型实例时&#xff0c;如果这个实例有ForeignKey关联到其他模型&#xff0…

Java文件管理

文件管理 Java中的对文件的管理&#xff0c;通过java.io包中的File类实现。Java中文件的管理&#xff0c;主要是针对文件或是目录路径名的管理&#xff0c;包括文件的属性信息&#xff0c;文件的检查&#xff0c;文件的删除等&#xff0c;但不包括文件的访问 file类 Java中的…

机器人开源调度系统OpenTcs6二开-车辆表定义

前面已经知道opentcs 需要车辆的模型结构数据&#xff0c;将里面的数据结构化&#xff0c;已表的形式生成&#xff0c;再找一个开源的基础框架项目对车辆进行增删改的管理 表结构&#xff1a; CREATE TABLE Vehicle (id INT AUTO_INCREMENT PRIMARY KEY COMMENT 唯一标识符,n…

GPT-4o全方位综合指南:功能解析、使用技巧与最佳实践

探索AI新时代&#xff1a;从GPT-4o特性到实用技巧&#xff0c;解锁高效AI助手的全部潜力 猫头虎是谁&#xff1f; 大家好&#xff0c;我是 猫头虎&#xff0c;别名猫头虎博主&#xff0c;擅长的技术领域包括云原生、前端、后端、运维和AI。我的博客主要分享技术教程、bug解决…

【功能】DOTween动画插件使用

一、下载安装DOTween插件&#xff0c;下载地址&#xff1a;DOTween - Asset Store (unity.com) 使用 Free免费版本即可&#xff0c;导入成功后&#xff0c;Project视图中会出现 DOTween 文件夹 二、使用案例 需求1&#xff1a;控制材质球中的某个属性值&#xff0c;实现美术需…

记录些MySQL题集(16)

MySQL 存储过程与触发器 一、初识MySQL的存储过程 Stored Procedure存储过程是数据库系统中一个十分重要的功能&#xff0c;使用存储过程可以大幅度缩短大SQL的响应时间&#xff0c;同时也可以提高数据库编程的灵活性。 存储过程是一组为了完成特定功能的SQL语句集合&#x…

node-red学习

Node-RED : 起步 1、安装nodejs Node.js — 在任何地方运行 JavaScript 验证 2、更换下载源 // 查看当前下载地址 npm config get registry // 设置淘宝镜像的地址 npm config set registry https://registry.npmmirror.com/ // 查看当前的下载地址 npm config get registry…

辅助类BigDecima/BigInteger

** 大数据的运算** 编号1方法解释1add2subtract-3multiply*4divide/

nginx动静分离配置实例

什么是动静分离 ngnix动静分离简单来说就是把动态请求和静态请求分开。不能理解成只是单纯的把动态页面和静态页面物理分离。 可以理解成使用nginx处理静态页面&#xff0c;使用tomcat处理动态页面。 动静分离目前从实现角度上可以分为两种&#xff1a; 纯粹把静态文件独立成…

程序员极力推荐的一款开发工具

如果你是一个独立开发者&#xff0c;或者你只是想自己动手开发一个应用&#xff0c;你一定会遇到各种麻烦事儿&#xff1a;搭建服务器、开发接口API、处理认证和存储问题……光是想想都头大。但别担心&#xff0c;这里有一款工具能让你省心省力&#xff0c;甚至能让你觉得开发应…

【论文阅读】MCTformer+:弱监督语义分割的多类令牌转换器

【论文阅读】MCTformer:弱监督语义分割的多类令牌转换器 文章目录 【论文阅读】MCTformer:弱监督语义分割的多类令牌转换器一、介绍1.1 WSSS背景1.2 WSSS策略 二、联系工作2.1 弱监督语义分割2.2 transformers的可视化应用 三、MULTI-CLASS TOKEN TRANSFORMER3.1 Multi-class t…

JavaSE学习笔记第三弹之异常抛出

今天我们继续来学习JavaSE相关的知识&#xff0c;希望与大家共同努力。 目录 异常 什么是异常 运行时异常 编译时异常 ​编辑 为什么需要异常处理机制 错误 异常的处理与抛出 异常处理 异常抛出 自定义异常 结语 异常 什么是异常 Java中异常是一种在程序运行时发…

PHP宠物店萌宠小程序系统源码

&#x1f43e;萌宠生活新方式&#x1f43e; &#x1f3e1;【一键直达萌宠世界】 你是否也梦想着拥有一家随时能“云撸猫”、“云吸狗”的神奇小店&#xff1f;现在&#xff0c;“宠物店萌宠小程序”就是你的秘密花园&#xff01;&#x1f31f;只需轻轻一点&#xff0c;就能瞬…

工厂方法模式java

文章目录 1. 概念2. 示例3. 代码示例 1. 概念 定义: 工厂方法模式又叫工厂模式,通过定义工厂父类创建对象的公共接口,而子类负责创建具体的对象 作用: 由工厂的子类来决定创建哪一个对象 缺点: 工厂一旦需要生成新的东西就需要修改代码,违背的开放封闭原则 2. 示例 3. 代码示…

Go语言并发编程-Context上下文

Context上下文 Context概述 Go 1.7 标准库引入 context&#xff0c;译作“上下文”&#xff0c;准确说它是 goroutine 的上下文&#xff0c;包含 goroutine 的运行状态、环境、现场等信息。 context 主要用来在 goroutine 之间传递上下文信息&#xff0c;包括&#xff1a;取…

rabbitmq简介与布署

rabbitMQ 常见的消息队列产品 rocketMQ&#xff08;火箭&#xff09; 阿里出品开源 kakfa 较少的核心提供超高的吞吐量&#xff0c;高可用高可靠高可扩展&#xff0c;但是建议支持较少的topic来保证其高吞吐量&#xff0c;适合大数据计算与日志收集。 rabbitMQ 基于erlang语言…

Chromium CI/CD 之Jenkins实用指南2024- 发送任务到Ubuntu(五)

1. 引言 在前一篇《Chromium CI/CD 之 Jenkins - 创建任务&#xff08;四&#xff09;》中&#xff0c;我们详细介绍了如何在Jenkins中创建和配置新任务&#xff0c;包括设置任务名称、选择运行节点、配置触发器、编写执行脚本以及添加文件收集步骤。通过这些步骤&#xff0c;…

COD论文笔记 Deep Gradient Learning for Efficient Camouflaged 2022

动机 这篇论文的动机在于解决伪装目标检测(COD)中的一个关键问题&#xff1a;在复杂背景下&#xff0c;伪装目标与背景的边界模糊&#xff0c;使得检测变得极其困难。现有的方法&#xff0c;如基于边界或不确定性的模型&#xff0c;通常仅响应于伪装目标的稀疏边缘&#xff0c…

最新Qt6的下载与成功安装详细介绍

引言 Qt6 是一款强大的跨平台应用程序开发框架&#xff0c;支持多种编程语言&#xff0c;最常用的是C。Qt6带来了许多改进和新功能&#xff0c;包括对C17的支持、增强的QML和UI技术、新的图形架构&#xff0c;以及构建系统方面的革新。本文将指导你如何在Windows平台上下载和安…

使用小波分析实现文字种类自动识别

文章目录 数据简介开始实验小波分解得出结果结果分析误差分析 数据简介 各找一篇中文&#xff0c;日文&#xff0c;韩文&#xff0c;英文&#xff0c;俄文较长的学术论文。将论文转化为JPG格式。拆分每张JPG生成更多小的JPG。最终获得很多5个不同语言的JPG并且自带标签。数据链…