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

LeedCode刷题---双指针问题

顾得泉:个人主页

个人专栏:《Linux操作系统》  《C/C++》  《LeedCode刷题》

键盘敲烂,年薪百万!


双指针简介

       常见的双指针有两种形式,一种是对撞指针,一种是左右指针。

对撞指针:一般用于顺序结构中,也称左右指针。

       对撞指针从两端向中间移动。一个指针从最左端开始,另一个从最右端开始。然后逐渐往中间逼近。

       对撞指针的终止条件一般是两个指针相遇或者错开(也可能在循环内部找到拿果直接跳出循
环),也就是:

       left == right(两个指针指向同一个位置)

       left > right(两个指针错开)

快慢指针:又称为龟兔赛跑算法,其基本思想就是使用两个移动速度不同的指针在数组或链表等序列结构上移动。

       这种方法对于处理环形链表或数组非常有用。

       其实不单单是环形链表或者是数组,如果我们要研究的问题出现循环往复的情况时,均可考虑使用快慢指针的思想。

       快慢指针的实现方式有很多种,最常用的—种就是:在一次循环中,每次让慢的指针向后移动一位,而快的指针往后移动两位,实现一快一慢。


一、移动零

题目链接:移动零

题目描述

       给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。

       请注意 ,必须在不复制数组的情况下原地对数组进行操作。

示例 1:

输入: nums = [0,1,0,3,12]
输出: [1,3,12,0,0]

示例 2:

输入: nums = [0]
输出: [0]

提示:

  • 1 <= nums.length <= 104
  • -231 <= nums[i] <= 231 - 1

解法

算法思路:

       在本题中,我们可以用一个cur 指针来扫描整个数组,另一个dest指针用来记录非零数序列的最后一个位置。根据cur在扫描的过程中,遇到的不同情况,分类处理,实现数组的划分。在cur遍历期间,使[0, dest]的元素全部都是非零元素,[dest + 1, cur - 1]的元素全是零。

算法流程:

       a.初始化 cur = 0(用来遍历数组),dest = -1(指向非零元素序列的最后一个位置。因为刚开始我们不知道最后一个非零元素在什么位置,因此初始化为-1)

       b.cur依次往后遍历每个元素,遍历到的元素会有下面两种情况

       i.遇到的元素是0 ,cur直接++。因为我们的目标是让[dest + 1, cur - 1]内的元素全都是零,因此当cur遇到o的时候,直接++,就可以让 o_在cur - 1的位置上,从而在[dest + 1, cur - 1]内;

       ii.遇到的元素不是0,dest++,并且交换cur位置和dest位置的元素,之后让cur++,扫描下一个元素。

       因为dest指向的位置是非零元素区间的最后一个位置,如果扫描到一个新的非零元素,那么它的位置应该在dest +1的位置上,因此dest先自增1;

       dest++之后,指向的元素就是0元素(因为非零元素区间末尾的后一个元素就是0)因此可以交换到cur所处的位置上,实现[0,dest]的元素全部都是非零元素,[dest+ 1, cur - 1]的元素全是零

代码实现

class Solution {
public:void moveZeroes(vector<int>& nums) {int dest = -1, cur = 0;while(cur < nums.size()){if(nums[cur])swap(nums[++dest],nums[cur]);cur++;}}
};

二、复写零

题目链接:复写零

题目描述

       给你一个长度固定的整数数组 arr ,请你将该数组中出现的每个零都复写一遍,并将其余的元素向右平移。

       注意:请不要在超过该数组长度的位置写入元素。请对输入的数组 就地 进行上述修改,不要从函数返回任何东西。

示例 1:

输入:arr = [1,0,2,3,0,4,5,0]
输出:[1,0,0,2,3,0,0,4]
解释:调用函数后,输入的数组将被修改为:[1,0,0,2,3,0,0,4]

示例 2:

输入:arr = [1,2,3]
输出:[1,2,3]
解释:调用函数后,输入的数组将被修改为:[1,2,3]

提示:

  • 1 <= arr.length <= 104
  • 0 <= arr[i] <= 9

解法

算法思路:

       如果「从前向后」进行原地复写操作的话,由于/的出现会复写两次,导致没有复写的数「被覆盖掉」。因此我们选择「从后往前」的复写策略。

       但是「从后向前」复写的时候,我们需要找到「最后一个复写的数」,因此我们的大体流程分两步:

       i.先找到最后一个复写的数;

       ii.然后从后向前进行复写操作

算法流程:

a.初始化两个指针cur=0, dest = 0;

b.找到最后一个复写的数︰

     i. 当cur <n的时候,一直执行下面循环:

       判断cur位置的元素:

       如果是0的话,dest往后移动两位;。否则,dest往后移动一位

       判断dest时候已经到结束位置,如果结束就终止循环;

       如果没有结束,cur++,继续判断

c.判断dest是否越界到n的位置:

     i.如果越界,执行下面三步:

       1. n - 1位置的值修改成0;

       2. cur向移动一步;

       3. dest向前移动两步

d. 从cur位置开始往前遍历原数组,依次还原出复写后的结果数组:

     i.判断cur位置的值:

       1.如果是0 :dest以及dest - 1位置修改成0,dest -= 2

       2.如果非零:dest位置修改成0,dest -= 1 ;

     ii. cur--,复写下一个位置

代码实现

class Solution {
public:void duplicateZeros(vector<int>& arr) {int cur = 0, dest = -1, n = arr.size();for(cur; cur < n; cur++){if(arr[cur]) dest++;elsedest += 2;if(dest >= n - 1)break;}if(dest == n){arr[n-1] = 0;cur--;dest -= 2;}while(cur >= 0){if(arr[cur])arr[dest--] = arr[cur--];else{arr[dest--] = 0;arr[dest--] = 0;cur--;}}}
};

三、快乐数

题目链接:

题目描述

        编写一个算法来判断一个数 n 是不是快乐数。

「快乐数」 定义为:

  • 对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和。
  • 然后重复这个过程直到这个数变为 1,也可能是 无限循环 但始终变不到 1。
  • 如果这个过程 结果为 1,那么这个数就是快乐数。

如果 n 是 快乐数 就返回 true ;不是,则返回 false 

示例 1:

输入:n = 19
输出:true
解释:
12 + 92 = 82
82 + 22 = 68
62 + 82 = 100
12 + 02 + 02 = 1

示例 2:

输入:n = 2
输出:false

提示:

  • 1 <= n <= 231 - 1

解法

算法思路:

       根据上述的题目分析,我们可以知道;当重复执行的时候,数据会陷入到一个「循环」之中。而「快慢指针」有一个特性。就是在一个圆圈中,快指针总是会追上慢指针的,也就是说他们总会相遇在一个位置上。如果相遇位置的值是1,那么这个数一定是快乐数;如果相遇位置不是1的话,那么就不是快乐数。

补充知识:

       如何求一个数n每个位置上的数字的平方和

a.把数n每一位的数提取出来:

     循环迭代下面步骤:

        i.int t = n % 10提取个位;

        ii. n /= 10干掉个位;

       直到n的值变为0 ;

b.提取每一位的时候,用一个变量tmp记录这一位的平方与之前提取位数的平方和

       tmp = tmp + t * t

代码实现

class Solution 
{
public:int Sum(int n) {int sum = 0;while(n){int t = n % 10;sum += t * t;n /= 10;}return sum;}bool isHappy(int n) {int slow = n, fast = Sum(n);while(slow != fast){slow = Sum(slow);fast = Sum(Sum(fast));}return slow == 1;}
};

结语:今日的刷题分享到这里就结束了,希望本篇文章的分享会对大家的学习带来些许帮助,如果大家有什么问题,欢迎大家在评论区留言~~~ 

相关文章:

LeedCode刷题---双指针问题

顾得泉&#xff1a;个人主页 个人专栏&#xff1a;《Linux操作系统》 《C/C》 《LeedCode刷题》 键盘敲烂&#xff0c;年薪百万&#xff01; 双指针简介 常见的双指针有两种形式&#xff0c;一种是对撞指针&#xff0c;一种是左右指针。 对撞指针:一般用于顺序结构中&…...

使用Notepad++编辑器,安装AnalysePlugin搜索插件

概述 是一款非常有特色的编辑器&#xff0c;Notepad是开源软件&#xff0c;Notepad中文版可以免费使用。 操作步骤&#xff1a; 1、在工具栏 ->“插件”选项。 2、勾选AnalysePlugin选项&#xff0c;点击右上角“安装”即可。 3、 确认安装插件 4、下载插件 5、插件已安装…...

胶囊网络实现手写数字分类

文章目录 前言一、完整代码二、修改成自己的数据集总结 前言 胶囊网络的概念可以先行搜索。 一、完整代码 import torch import torch.nn.functional as F from torch import nn from torchvision import transforms, datasets from torch.optim import Adam from torch.util…...

Java零基础-if条件语句

前言 条件语句是编程语言中最基础也是最常用的语句之一&#xff0c;对于初学者来说&#xff0c;掌握好条件语句是学习编程的第一步。本文将以Java开发语言为例&#xff0c;详细介绍Java中的if条件语句及其应用场景。 摘要 本文主要包含以下内容&#xff1a; Java中的if条件…...

中国证券交易所有哪些

中国一共有五个证券交易所&#xff0c;分别是&#xff1a; 1、上海证券交易所。 上海证券交易所&#xff0c;简称为上交所。 ①成立时间&#xff1a;上交所成立于1990年11月26日&#xff0c;同年12月19日开业。 ②规模&#xff1a;截至2020年末&#xff0c;沪市上市公司家数…...

欢迎回到 C++ - 现代 C++(心得-壹)

原文链接欢迎回到 C - 现代 C | Microsoft Learn 这里先是讲了现代c的优势&#xff0c;其相对于其他编程语言有快速、高效。 相对于其他语言&#xff0c;该语言更加灵活&#xff0c;跨平台&#xff08;硬件平台&#xff09;性也很强&#xff0c;可以直接访问硬件&#xff0c;虽…...

【Vue3+Ts项目】硅谷甄选 — 搭建后台管理系统模板

一、 项目初始化 一个项目要有统一的规范&#xff0c;需要使用eslintstylelintprettier来对我们的代码质量做检测和修复&#xff0c;需要使用husky来做commit拦截&#xff0c;需要使用commitlint来统一提交规范&#xff08;即统一提交信息&#xff09;&#xff0c;需要使用pre…...

MATLAB 系统辨识 - 在线估计 - Online Estimation

系列文章目录 MATLAB 模型参考自适应控制 - Model Reference Adaptive Control MATLAB 自抗扰控制 - Active Disturbance Rejection Control 文章目录 系列文章目录前言一、在线参数估计二、使用步骤 前言 在线估计&#xff08;Online estimation&#xff09;算法是在物理系…...

【Java面试——基础题】

Java基础部分&#xff0c;包括语法基础&#xff0c;泛型&#xff0c;注解&#xff0c;异常&#xff0c;反射和其它&#xff08;如SPI机制等&#xff09;。 1.1 语法基础 面向对象特性&#xff1f; 封装 利用抽象数据类型将数据和基于数据的操作封装在一起&#xff0c;使其构成…...

Haiku库和Jax库介绍

Haiku 是由DeepMind开发的一个深度学习库&#xff0c;它建立在JAX&#xff08;Just Another XLA&#xff0c;为Accelerated Linear Algebra的缩写&#xff09;之上。JAX 是一个由Google开发的数值计算库&#xff0c;专注于高性能数值计算和自动微分。 JAX 提供了强大的数值计算…...

2023-简单点-proxyPool源码(二)-setting.py

proxyPool setting.py setting.py # -*- coding: utf-8 -*- """ -------------------------------------------------File Name&#xff1a; setting.pyDescription : 配置文件Author : JHaodate&#xff1a; 2019/2/15 ---------------…...

中级工程师评审条件:如何成为一名合格的中级工程师

作为一名工程师&#xff0c;不仅需要具备扎实的技术基础和实践能力&#xff0c;还需要通过评审来证明自己的能力水平。在成为一名合格的中级工程师之前&#xff0c;你需要满足一系列评审条件。甘建二今天将详细介绍中级工程师评审的要求和标准&#xff0c;帮助你成为更优秀的工…...

StarRocks上新,“One Data、All Analytics”还有多远?

K.K在《未来十二大趋势》中认为&#xff0c;我们正处于一个数据流动的时代。商业乃数据之商业。归根结底&#xff0c;你在处理的都是数据。 的确&#xff0c;当数据成为新的核心生产要素之际&#xff0c;数据分析就犹如最重要的生产工具之一&#xff0c;决定着企业在数字化时代…...

Java8实战-总结50

Java8实战-总结50 CompletableFuture&#xff1a;组合式异步编程对多个异步任务进行流水线操作对 Future 和 CompletableFuture 的回顾 响应 CompletableFuture 的 completion 事件对最佳价格查询器应用的优化 CompletableFuture&#xff1a;组合式异步编程 对多个异步任务进行…...

kicad源代码研究:参照Candence实现工程管理

创建工程&#xff1a; 创建工程和打开工程触发事件&#xff1a; KICAD_MANAGER_ACTIONS::newProjectKICAD_MANAGER_ACTIONS::openProjectnewProject和OpenProject事件响应具体实现&#xff0c;在KICAD_MANAGER_CONTROL类中实现&#xff1a; Go( &KICAD_MANAGER_CONTROL::…...

Asp.net core WebApi 配置自定义swaggerUI和中文注释,Jwt Bearer配置

1.创建asp.net core webApi项目 默认会引入swagger的Nuget包 <PackageReference Include"Swashbuckle.AspNetCore" Version"6.2.3" />2.配置基本信息和中文注释&#xff08;默认是没有中文注释的&#xff09; 2.1创建一个新的controller using Micr…...

DNS 查询结果逐行解释

文章目录 FlagsADDITIONALANSWER SECTIONQuery timeSERVERWHENDNS PortAuthoritative answer权威DNS服务器Non-authoritative answer推荐阅读 DNS查询后&#xff0c;查询结果一般如下&#xff1a; mirrorUbuntu22:~$ dig www.baidu.com; <<>> DiG 9.18.12-0ubuntu0…...

ArcGIS制作广场游客聚集状态及密度图

文章目录 一、加载实验数据二、平均最近邻法介绍1. 平均最近邻工具2. 广场游客聚集状态3. 结果分析三、游客密度制图一、加载实验数据 二、平均最近邻法介绍 1. 平均最近邻工具 “平均最近邻”工具将返回五个值:“平均观测距离”、“预期平均距离”、“最近邻指数”、z 得分和…...

同旺科技 USB TO SPI / I2C --- 调试W5500_TCP Client接收数据

所需设备&#xff1a; 内附链接 1、USB转SPI_I2C适配器(专业版); 首先&#xff0c;连接W5500模块与同旺科技USB TO SPI / I2C适配器&#xff0c;如下图&#xff1a; 发送数据6个字节的数据&#xff1a;0x11,0x22,0x33,0x44,0x55,0x66 在专业版调试软件中编辑指令&#xff0c…...

MQ - KAFKA 高级篇

kafak是一个分布式流处理平台,提供消息持久化,基于发布-订阅的方式的消息中间件&#xff0c;同时通过消费端配置相同的groupId支持点对点通信。 ##适用场景&#xff1a; 构造实时流数据管道,用于系统或应用之间可靠的消息传输.数据采集及处理,例如连接到一个数据库系统,捕捉表…...

工业安全零事故的智能守护者:一体化AI智能安防平台

前言&#xff1a; 通过AI视觉技术&#xff0c;为船厂提供全面的安全监控解决方案&#xff0c;涵盖交通违规检测、起重机轨道安全、非法入侵检测、盗窃防范、安全规范执行监控等多个方面&#xff0c;能够实现对应负责人反馈机制&#xff0c;并最终实现数据的统计报表。提升船厂…...

解锁数据库简洁之道:FastAPI与SQLModel实战指南

在构建现代Web应用程序时&#xff0c;与数据库的交互无疑是核心环节。虽然传统的数据库操作方式&#xff08;如直接编写SQL语句与psycopg2交互&#xff09;赋予了我们精细的控制权&#xff0c;但在面对日益复杂的业务逻辑和快速迭代的需求时&#xff0c;这种方式的开发效率和可…...

Go 语言接口详解

Go 语言接口详解 核心概念 接口定义 在 Go 语言中&#xff0c;接口是一种抽象类型&#xff0c;它定义了一组方法的集合&#xff1a; // 定义接口 type Shape interface {Area() float64Perimeter() float64 } 接口实现 Go 接口的实现是隐式的&#xff1a; // 矩形结构体…...

拉力测试cuda pytorch 把 4070显卡拉满

import torch import timedef stress_test_gpu(matrix_size16384, duration300):"""对GPU进行压力测试&#xff0c;通过持续的矩阵乘法来最大化GPU利用率参数:matrix_size: 矩阵维度大小&#xff0c;增大可提高计算复杂度duration: 测试持续时间&#xff08;秒&…...

OpenLayers 分屏对比(地图联动)

注&#xff1a;当前使用的是 ol 5.3.0 版本&#xff0c;天地图使用的key请到天地图官网申请&#xff0c;并替换为自己的key 地图分屏对比在WebGIS开发中是很常见的功能&#xff0c;和卷帘图层不一样的是&#xff0c;分屏对比是在各个地图中添加相同或者不同的图层进行对比查看。…...

html css js网页制作成品——HTML+CSS榴莲商城网页设计(4页)附源码

目录 一、&#x1f468;‍&#x1f393;网站题目 二、✍️网站描述 三、&#x1f4da;网站介绍 四、&#x1f310;网站效果 五、&#x1fa93; 代码实现 &#x1f9f1;HTML 六、&#x1f947; 如何让学习不再盲目 七、&#x1f381;更多干货 一、&#x1f468;‍&#x1f…...

【Java学习笔记】BigInteger 和 BigDecimal 类

BigInteger 和 BigDecimal 类 二者共有的常见方法 方法功能add加subtract减multiply乘divide除 注意点&#xff1a;传参类型必须是类对象 一、BigInteger 1. 作用&#xff1a;适合保存比较大的整型数 2. 使用说明 创建BigInteger对象 传入字符串 3. 代码示例 import j…...

CRMEB 中 PHP 短信扩展开发:涵盖一号通、阿里云、腾讯云、创蓝

目前已有一号通短信、阿里云短信、腾讯云短信扩展 扩展入口文件 文件目录 crmeb\services\sms\Sms.php 默认驱动类型为&#xff1a;一号通 namespace crmeb\services\sms;use crmeb\basic\BaseManager; use crmeb\services\AccessTokenServeService; use crmeb\services\sms\…...

第7篇:中间件全链路监控与 SQL 性能分析实践

7.1 章节导读 在构建数据库中间件的过程中&#xff0c;可观测性 和 性能分析 是保障系统稳定性与可维护性的核心能力。 特别是在复杂分布式场景中&#xff0c;必须做到&#xff1a; &#x1f50d; 追踪每一条 SQL 的生命周期&#xff08;从入口到数据库执行&#xff09;&#…...

tomcat入门

1 tomcat 是什么 apache开发的web服务器可以为java web程序提供运行环境tomcat是一款高效&#xff0c;稳定&#xff0c;易于使用的web服务器tomcathttp服务器Servlet服务器 2 tomcat 目录介绍 -bin #存放tomcat的脚本 -conf #存放tomcat的配置文件 ---catalina.policy #to…...