当前位置: 首页 > 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; 构造实时流数据管道,用于系统或应用之间可靠的消息传输.数据采集及处理,例如连接到一个数据库系统,捕捉表…...

【第二十一章 SDIO接口(SDIO)】

第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...

【大模型RAG】Docker 一键部署 Milvus 完整攻略

本文概要 Milvus 2.5 Stand-alone 版可通过 Docker 在几分钟内完成安装&#xff1b;只需暴露 19530&#xff08;gRPC&#xff09;与 9091&#xff08;HTTP/WebUI&#xff09;两个端口&#xff0c;即可让本地电脑通过 PyMilvus 或浏览器访问远程 Linux 服务器上的 Milvus。下面…...

Linux简单的操作

ls ls 查看当前目录 ll 查看详细内容 ls -a 查看所有的内容 ls --help 查看方法文档 pwd pwd 查看当前路径 cd cd 转路径 cd .. 转上一级路径 cd 名 转换路径 …...

Cinnamon修改面板小工具图标

Cinnamon开始菜单-CSDN博客 设置模块都是做好的&#xff0c;比GNOME简单得多&#xff01; 在 applet.js 里增加 const Settings imports.ui.settings;this.settings new Settings.AppletSettings(this, HTYMenusonichy, instance_id); this.settings.bind(menu-icon, menu…...

从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)

设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile&#xff0c;新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...

力扣-35.搜索插入位置

题目描述 给定一个排序数组和一个目标值&#xff0c;在数组中找到目标值&#xff0c;并返回其索引。如果目标值不存在于数组中&#xff0c;返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 class Solution {public int searchInsert(int[] nums, …...

使用Matplotlib创建炫酷的3D散点图:数据可视化的新维度

文章目录 基础实现代码代码解析进阶技巧1. 自定义点的大小和颜色2. 添加图例和样式美化3. 真实数据应用示例实用技巧与注意事项完整示例(带样式)应用场景在数据科学和可视化领域,三维图形能为我们提供更丰富的数据洞察。本文将手把手教你如何使用Python的Matplotlib库创建引…...

Fabric V2.5 通用溯源系统——增加图片上传与下载功能

fabric-trace项目在发布一年后,部署量已突破1000次,为支持更多场景,现新增支持图片信息上链,本文对图片上传、下载功能代码进行梳理,包含智能合约、后端、前端部分。 一、智能合约修改 为了增加图片信息上链溯源,需要对底层数据结构进行修改,在此对智能合约中的农产品数…...

省略号和可变参数模板

本文主要介绍如何展开可变参数的参数包 1.C语言的va_list展开可变参数 #include <iostream> #include <cstdarg>void printNumbers(int count, ...) {// 声明va_list类型的变量va_list args;// 使用va_start将可变参数写入变量argsva_start(args, count);for (in…...

从面试角度回答Android中ContentProvider启动原理

Android中ContentProvider原理的面试角度解析&#xff0c;分为​​已启动​​和​​未启动​​两种场景&#xff1a; 一、ContentProvider已启动的情况 1. ​​核心流程​​ ​​触发条件​​&#xff1a;当其他组件&#xff08;如Activity、Service&#xff09;通过ContentR…...