初识算法 · 双指针(4)

目录

前言:

复写零

题目解析

算法原理

算法编写

四数之和

题目解析

算法原理

算法编写


前言:

本文是双指针算法的最后一文,以复写零和四数之和作为结束,介绍方式同样是题目解析,算法原理,算法编写三部曲,以下是题目的链接:

1089. 复写零 - 力扣(LeetCode)

18. 4Sum - 力扣(LeetCode)

那么话不多说,直接进入主题。


复写零

题目解析

题目的要求就是,在原来的数组基础上(不允许另外创建一个数组),调用了函数,原来是零的地方,写两次,并且不能影响后面的元素,除非是已经超过了数组的空间。题目的要求还是比较简单的。

那么这道题存不存在暴力解法呢?

显然,这道题并不是通过n个循环就可以解决的,所以我们不妨直接使用双指针。

到这个阶段,不妨不用思考为什么使用双指针,因为目前来说算法基础并不牢靠,我们不妨积累经验。

算法原理

我们不妨模拟一下这个复写零的过程:

cur指向的是原来的数组,我们假设条件就地修改这个条件不存在,我们如果是新开一块空间,过程就是两个for遍历数组,如果不是0,cur dest都++,如果是0,cur++,dest++两次,这是原来的过程,最后结束条件就是判断dest是否到了结束位置。

在这个过程,我们要考虑一个点就是dest如果是碰见了0进行复写,第二个零越界了怎么办?

这个情况我们只需要将原数组的最后一个位置置为零即可,虽然越界,但是是因为复写,此时最后置为零就完全没问题了。

那么为什么我们要模拟这过程呢?

因为我们要找到最后一个复写的数,如果找不到,我们没有办法进行后续的复写操作。

第一步也就完成了,找到复写的最后一个数,最后开始复写。

开始复写的判断结束条件就是cur是否走到了-1,判断arr[cur]是否为0,是0dest就多走一步,不是就走一步,别看说着轻松,有许多要注意的。

算法编写

class Solution
{
public:void duplicateZeros(vector<int>& arr) {//找到最后一个复写的数int cur = 0,dest = -1;while(cur < arr.size()){if(arr[cur]) dest++;else dest += 2;//边界验证的辅助条件if(dest >= arr.size() - 1) break;cur++;}//处理边界情况 并且进行第一步复写if(dest == arr.size()){arr[dest - 1] = 0;dest -= 2,cur--;}//进行复写while(cur >= 0){if(arr[cur]) arr[dest--] = arr[cur];else arr[dest--] = 0,arr[dest--] = 0;     cur--;  }}
};

第一个点,为什么dest要从-1开始,因为cur要先判断,判断之后dest才走,如果一开始dest就在0位置,那么就相当于多走了一步,我们拿数组[0]举例,如果dest在0位,那么走两步,最后的位置是2,已经完全超过了我们预期的判断位置,即便是越界,越的也应该是1这个位置。

第二个点,处理边界的时候,dest和cur需要移动,因为这已经是一次复写了。

第三个点,复写的时候,if(arr[cur])里面的cur是不可以--的,因为后面会用到当前的cur。

这几个小细节注意点为好。

此时这道题就做完了,时间复杂度呢是O(N),空间复杂度为O(1)。


四数之和

题目解析

题目的意思和三数之和十分像的,三数之和是找三个数等于0,那么该题目是找4个数字等于target,并且下标不能重复,也就是一个数字不能一直使用,题目的要求很简单,所以我们直接进入算法原理部分。

算法原理

原理和三数之和是十分像的,我们只需要固定个数,然后找三个数和该数 - target相等,再固定一个数,找两个数,等于target - 两外两个数,这就是妥妥的双指针了,根本不需要经过思考就可以动手了,其次就是去重操作,就没有了。

算法编写

class Solution 
{
public:vector<vector<int>> fourSum(vector<int>& nums, int target) {sort(nums.begin(),nums.end());vector<vector<int>> ans;for(int i = nums.size() - 1;i > 2;){for(int j = i - 1;j > 1;){int left = 0, right = j - 1; while(left < right){long long sum = (long long)nums[j] + (long long)nums[left] + (long long)nums[right] + (long long)nums[i];if( sum == (long long)target) {ans.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--; }else if(sum > (long long)target)right--;else left++;}    j--;while(j > 1 && nums[j] == nums[j + 1]) j--;}i--;while(i > 2 && nums[i] == nums[i + 1]) i--;}   return ans;}
};

至于为什么使用long long,因为:

这个题目较为恶心的是,,存在int溢出的风险。

双指针算法也就到这里啦,后面的是滑动窗口~


感谢阅读!

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

电气自动化入门10:传感器应用介绍

视频链接&#xff1a;4.1 电工知识&#xff1a;传感器应用介绍与接近开关的实际应用_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1PJ41117PW?p12&vd_sourceb5775c3a4ea16a5306db9c7c1c1486b5 1.电工传感器介绍 2.常用电工传感器的种类和用途 3.接近开关

计算机毕业设计 基于Python的无人超市管理系统的设计与实现 Python+Django+Vue 前后端分离 附源码 讲解 文档

&#x1f34a;作者&#xff1a;计算机编程-吉哥 &#x1f34a;简介&#xff1a;专业从事JavaWeb程序开发&#xff0c;微信小程序开发&#xff0c;定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事&#xff0c;生活就是快乐的。 &#x1f34a;心愿&#xff1a;点…

TCP BIC 的拟合函数分析

前面说了这么多&#xff0c;还没有对 bic 的数学性质进行分析&#xff0c;本文补上。 tcp reno 完全依赖 ack 时钟以 rtt 为单位线性增窗&#xff0c;增窗速度与 rtt 负相关&#xff0c;如何在 rtt 比较大时增加增窗速度&#xff0c;这就是 bic&#xff0c;以二分替换遍历。 …

银河麒麟服务器:检查仓库源连接状态

银河麒麟服务器&#xff1a;检查仓库源连接状态 1. 清理YUM缓存2. 生成YUM缓存 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 在银河麒麟高级服务器操作系统中&#xff0c;要检查仓库源是否连接成功&#xff0c;可以执行以下两个命令&…

SQL优化 - 排序

文章目录 排序和索引降序索引 FilesortORDER BY 顺序问题ORDER BY LIMIT 排序和索引 如果ORDER BY操作使用了索引&#xff0c;那么就可以避免排序操作&#xff0c;因为索引本身就是按索引 key 排好序的。那什么情况下&#xff0c;ORDER BY会走索引呢&#xff1f; 例如&#…

C#基于SkiaSharp实现印章管理(10)

向PDF文件插入印章图片比之前实现的向图片文件插入印章麻烦得多。   最初的想法是使用PDF浏览控件在线打开PDF文件&#xff0c;然后在控件中实现鼠标移动时动态显示印章&#xff0c;点击鼠标时向当前PDF页面的鼠标点击位置插入图片。由于是.net 8的Winform项目&#xff0c;选…

Elasticsearch学习记录

阅读前须知 本文通过安装elasticsearch-7.17.0为基础&#xff0c;使用 kibana-7.17.0 对 elasticsearch 进行操作&#xff0c;本文中 es 是对 elasticsearch 的简写。 下载地址&#xff1a;elasticsearch_免费高速下载|百度网盘-分享无限制 (baidu.com) 1 初识Elasticsearch …

用 LoRA 微调 Stable Diffusion:拆开炼丹炉,动手实现你的第一次 AI 绘画

总得拆开炼丹炉看看是什么样的。这篇文章将带你从代码层面一步步实现 AI 文本生成图像&#xff08;Text-to-Image&#xff09;中的 LoRA 微调过程&#xff0c;你将&#xff1a; 了解 Trigger Words&#xff08;触发词&#xff09;到底是什么&#xff0c;以及它们如何影响生成结…

redis面试-2024

1、Redis的基本数据结构类型 string、list、set、hash、zet。还有三种特殊类型&#xff1a;Geospatial、Hyperloglog、bitMap。 2、各数据类型对应的场景 3、redis快的原因 *基于内存 内存读写效率远高于磁盘读写&#xff0c;省去磁盘IO操作 *存储形式 Redis作为K-V键值对…

MFC有三个选项:MFC ActiveX控件、MFC应用程序、MFC DLL,如何选择?

深耕AI&#xff1a;互联网行业 算法研发工程师 ​ 目录 MFC ActiveX 控件 控件的类型 标准控件 自定义控件 ActiveX控件 MFC ActiveX控件 标准/自定义控件 MFC ActiveX控件分类 3种MFC如何选择&#xff1f; MFC ActiveX控件 MFC 应用程序 MFC DLL 总结 举例说明…

微信小程序处理交易投诉管理,支持多小程序

大家好&#xff0c;我是小悟 1、问题背景 玩过微信小程序生态的&#xff0c;或许就有这种感受&#xff0c;如果收到投诉单&#xff0c;不会及时通知到手机端&#xff0c;而是每天早上10:00向小程序的管理员及运营者推送通知。通知内容为截至前一天24时该小程序账号内待处理的交…

k8s基础环境部署

什么是k8s K8s&#xff0c;全称Kubernetes&#xff0c;是一个开源的容器编排平台&#xff0c;由谷歌&#xff08;Google&#xff09;开发并开源。Kubernetes这个名字源于希腊语&#xff0c;意为“舵手”或“飞行员”&#xff0c;而“k8s”这个缩写则是因为“k”和“s”之间有八…

【目标检测】yolo的三种数据集格式

目标检测中数据集格式之间的相互转换--coco、voc、yolohttps://zhuanlan.zhihu.com/p/461488682?utm_mediumsocial&utm_psn1825483604463071232&utm_sourcewechat_session【目标检测】yolo的三种数据集格式https://zhuanlan.zhihu.com/p/525950939?utm_mediumsocial&…

【移植】一种快速移植OpenHarmony Linux内核的方法

往期知识点记录&#xff1a; 鸿蒙&#xff08;HarmonyOS&#xff09;应用层开发&#xff08;北向&#xff09;知识点汇总 鸿蒙&#xff08;OpenHarmony&#xff09;南向开发保姆级知识点汇总~ 持续更新中…… 移植概述 本文面向希望将 OpenHarmony 移植到三方芯片平台硬件的开…

基于Spring Boot+Vue的减肥健康管理系统设计和实现【原创】(BMI算法,协同过滤算法、图形化分析)

&#x1f388;系统亮点&#xff1a;图形化分析、BMI算法&#xff0c;协同过滤算法&#xff1b; 一.系统开发工具与环境搭建 1.系统设计开发工具 后端使用Java编程语言的Spring boot框架 项目架构&#xff1a;B/S架构 运行环境&#xff1a;win10/win11、jdk17 前端&#xff1a…

计算机网络-系分(5)

目录 计算机网络 DNS解析 DHCP动态主机配置协议 网络规划与设计 层次化网络设计 网络冗余设计 综合布线系统 1. 双栈技术 2. 隧道技术 3. 协议转换技术 其他网络技术 DAS&#xff08;Direct Attached Storage&#xff0c;直连存储&#xff09; NAS&#xff08;Net…

【Immich部署与访问】自托管媒体文件备份服务 Immich 本地化部署与远程访问存储数据

文章目录 前言1.关于Immich2.安装Docker3.本地部署Immich4.Immich体验5.安装cpolar内网穿透6.创建远程链接公网地址7.使用固定公网地址远程访问 前言 本篇文章介绍如何在本地搭建lmmich图片管理软件&#xff0c;并结合cpolar内网穿透实现公网远程访问到局域网内的lmmich&#…

【环境配置】科研小白Windows下安装Git

2024年小白使用Win10安装Git 2.46.2教程&#xff1a; 1 下载安装包 访问下载地址 Git - Downloading Package (git-scm.com) 下载之后打开文件 2 安装过程 点击Next 2.1 选择安装路径 2.2 选择勾选必要组件 2.3 一路Next 这一步直接Next即可 继续点击Next 继续点击Ne…

从零开始Hadoop集群环境搭建

目录 1. Centos7.5硬件配置1.1 创建虚拟机1.2 虚拟机系统设置 2. IP地址和主机名称配置3. 软件配置3.1 安装 epel-release3.2 卸载虚拟机自带的JDK3.3 克隆虚拟机3.4 修改克隆虚拟机的IP3.5 JDK安装3.6 Hadoop安装 4. Hadoop目录结构 1. Centos7.5硬件配置 1.1 创建虚拟机 1.2…

SpringBoot基础(三):Logback日志

SpringBoot基础系列文章 SpringBoot基础(一)&#xff1a;快速入门 SpringBoot基础(二)&#xff1a;配置文件详解 SpringBoot基础(三)&#xff1a;Logback日志 目录 一、日志依赖二、日志格式1、记录日志2、默认输出格式3、springboot默认日志配置 三、日志级别1、基础设置2、…