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

双指针常用方法

1.双指针介绍

双指针是解题时一种常见的思路,一般有两种用法。

1)两个指针反方向,分别从数组开头和结尾开始移动,例如对有序数组的搜索。

2)两个指针同方向移动,例如快慢指针,都是从数组开头开始遍历,只是速度不一样。

除了用于数组,也可以用于链表,树,图。

2.反向的双指针

力扣icon-default.png?t=N2N8https://leetcode.cn/problems/two-sum-ii-input-array-is-sorted/

因为数组是非递减的,所以可以数组首尾各置一个指针,若值相加大于目标值,则尾指针自减,若值相加小于目标值,则头指针自增,这样就一步步逼近了目标值。

class Solution {
public:vector<int> twoSum(vector<int>& numbers, int target) {int i = 0, j = numbers.size()-1;while(i<j){int t = numbers[i] + numbers[j];if(target==t) return vector<int>({i+1,j+1});else if(target>t){i++;}else{j--;}}return vector<int>();}
};

3.同向的双指针

力扣icon-default.png?t=N2N8https://leetcode.cn/problems/linked-list-cycle-ii/这题有两个要点,先是要判断链表中是否有环,接着是找到环的入口。

判断是否有环,可以用快慢指针。

两个指针同时从起点出发,快指针一次两步,慢指针一次一步。

如果链表中有环,则快慢指针一定会相遇,就像在操场上一直跑圈,速度快的人一定会在某一刻比速度慢的人多跑一圈,所以二人相遇了。

若是快慢指针没有相遇,且快指针指向了NULL,那很明显,就是没有环。

确定链表有环后,就是寻找环的入口了。

可以用题目中的示例来简单理解一下。

下图使用快慢指针,从起点[3]出发,慢指针一次一步,快指针一次两步,很快这两个指针会在节点[-4]相遇。

相遇后,将慢指针移回链表起点[3],快慢指针都一次走一步,两个指针再次相遇的节点[2],就是环的入口。

 一个简单易懂的解释就是:

慢指针路径:起点--环的入口--快慢指针相遇的节点

快指针路径:起点--环的入口--快慢指针相遇的节点--环的入口--快慢指针相遇的节点

因为快指针路径==慢指针路径*2

所以【快慢指针相遇的节点--环的入口--快慢指针相遇的节点】== 【 起点--环的入口--快慢指针相遇的节点】

同时减去【环的入口--快慢指针相遇的节点】

所以【快慢指针相遇的节点--环的入口】== 【 起点--环的入口】

所以找到环得到入口就是将慢指针移到起点,与快指针都是一次一步,直到相遇,相遇节点就是环的入口。

如果还是没有理解的,可以直接搜索【Floyd 判圈法】找动画视频直观理解一下。

代码:

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     ListNode *next;*     ListNode(int x) : val(x), next(NULL) {}* };*/
class Solution {
public:ListNode *detectCycle(ListNode *head) {if(!head) return NULL;ListNode* slow = head, *fast = head;while(slow->next && fast->next && fast->next->next){slow = slow->next;fast = fast->next->next;if(slow==fast){slow = head;while(slow!=fast){slow = slow->next;fast = fast->next;}return slow;}}return NULL;}
};

相关文章:

双指针常用方法

1.双指针介绍 双指针是解题时一种常见的思路&#xff0c;一般有两种用法。 1&#xff09;两个指针反方向&#xff0c;分别从数组开头和结尾开始移动&#xff0c;例如对有序数组的搜索。 2&#xff09;两个指针同方向移动&#xff0c;例如快慢指针&#xff0c;都是从数组开头…...

人工智能大模型之ChatGPT原理解析

前言 近几个月ChatGPT爆火出圈&#xff0c;一路狂飙&#xff1b;它功能十分强大&#xff0c;不仅能回答各种各样的问题&#xff0c;还可以信写作&#xff0c;给程序找bug…我经过一段时间的深度使用后&#xff0c;十分汗颜&#xff0c;"智障对话"体验相比&#xff0c…...

傅里叶谱方法-傅里叶谱方法的原理、快速傅里叶变换及其Matlab程序实现

第 3 章 傅里叶谱方法 本章介绍的求解偏微分方程(组)的方法都包含着周期性边界条件, 尽管周期性边界条件不属于数学物理方法中常见的传统三类边界条件, 但它并不脱离实际。某些科学问题的研究重点不受边界的影响, 如孤子之间的相互作用 (非线性薛定谔方程或 K d V \mathrm{…...

11万字数字政府智慧政务大数据建设平台(大数据底座、数据治理)

本资料来源公开网络&#xff0c;仅供个人学习&#xff0c;请勿商用&#xff0c;如有侵权请联系删除。部分资料内容&#xff1a; 一.1.1 数据采集子系统 数据采集需要实现对全区各委办单位的数据采集功能&#xff0c;包括离线采集、准实时采集和实时采集的采集方式&#xff0c;根…...

Node.js学习笔记——Node.js模块化

一、介绍 1.1.什么是模块化与模板&#xff1f; 将一个复杂的程序文件依据一定规则&#xff08;规范&#xff09;拆分成多个文件的过程称之为模块化。 其中拆分出的每个文件就是一个模块&#xff0c;模块的内部数据是私有的&#xff0c;不过模块可以暴露内部数据以便其他模块…...

【洛谷刷题】蓝桥杯专题突破-广度优先搜索-bfs(12)

目录 写在前面&#xff1a; 题目&#xff1a;P1746 离开中山路 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 题目描述&#xff1a; 输入格式&#xff1a; 输出格式&#xff1a; 输入样例&#xff1a; 输出样例&#xff1a; 解题思路&#xff1a; 代码&#xff1a; …...

【数据结构】堆(堆的实现 堆向下调整算法 堆的创建 堆的插入 堆的删除 堆的代码实现 堆的应用)

文章目录堆的实现堆向下调整算法堆的创建堆的插入堆的删除堆的代码实现堆的应用堆的实现 堆是属于操作系统进程地址空间内存区域的划分。 我们下面实现数据结构中的堆。 堆是一个完全二叉树&#xff1a;分为小根堆和大根堆。 小根堆&#xff1a;任何一个节点的值都<孩子的…...

JDBC数据库驱动的下载与安装与连接

目录 JDBC数据库驱动下载 Intellij IDEA安装JDBC驱动 在使用 JDBC 之前&#xff0c;需要下载相应的 JDBC 驱动程序&#xff0c;该驱动程序应该与你使用的数据库的版本相对应。可以在数据库官网上找到相应的 JDBC 驱动程序。 JDBC数据库驱动下载 点击官方链接 MySQL :: MySQ…...

如何更改 PDF 背景颜色?

PDF 是用于简洁演示的文件格式&#xff0c;许多员工都参考它来演示文件。如果您想要 PDF 文本的最佳对比度方案&#xff0c;我们建议您更改PDF 背景颜色。您甚至可以更改 PDF 颜色的文本&#xff0c;但它不会有太大吸引力&#xff0c;而是尝试使用 PDF 背景更改器应用程序。如果…...

room数据库使用以及增加表的使用

依赖 "androidx.room:room-runtime:2.2.6" "androidx.room:room-compiler:2.2.6" 1.实体类 实体类需要保存到数据库的新类用Entity注解表示 tableName是数据库中表的名字&#xff0c;my_advert可以根据自己需要自定义 PrimaryKey&#xff0c;NonNull主键…...

WiFi-交互过程分析

目录 1.802.11 标准简介 2.802.11 协议格式 2.1管理帧协议格式 2.1.1(Beacon (信标) 帧) 2.1.2(Probe Request (探测请求) 帧) 2.1.3(Probe Response (探测响应) 帧) 2.1.4(ATIM 帧) 2.1.5(Disassociation (解除关联) 与 Deauthentication (解除认证) 帧) 2.1.6(Assoc…...

基于ZYNQ+linux+xenomai 的多轴运动控制平台关键技术研发-测试系统搭建(四)

本章搭建实验测试平台&#xff0c;对多轴运动控制平台的硬件功能和系统任务通信功能 进行测试。通过测试结果&#xff0c;进行平台硬件设计正确性验证和系统实时处理与同步控制 的功能与性能验证。 5.1 测试平台搭建 多轴运动控制系统的测试平台搭建如图 5.1 所示。测试平台由安…...

初识操作系统

目录 1.操作系统是什么 2.为什么要有操作系统 3.操作系统的相关关系 1.驱动程序 2.系统调用接口 3.用户调用接口 4.用户程序 4.用具体的例子理解操作系统 1.操作系统是什么 &#xff08;1&#xff09;操作系统是一组管理计算机硬件与软件资源的计算机软件程序 。 &#xff08;…...

#详细介绍!!!线程池

本篇详细&#xff1a; 1.介绍了什么是线程池 2.使用线程池有什么好处 3.线程池的工作流程 4.线程池的各个参数介绍 5.如何编写Java代码来创建线程池 6.使用线程池的注意事项 目录 一&#xff1a;什么是线程池 二&#xff1a;为什么使用线程池来管理线程 三&#xff1a;线程池…...

【嵌入式Linux学习笔记】基于Linux官方库的标准外设驱动

对于标准的外设如LED&#xff0c;KEY&#xff0c;PWM等&#xff0c;以及标准通信协议&#xff0c;Linux都自带有标准的驱动库&#xff0c;不需要我们自行编写&#xff0c;只需要配置好相应的GPIO属性和电气属性&#xff0c;即可匹配相应的驱动&#xff0c;在应用程序中直接使用…...

网络爬虫抓包工具

&#x1f4da;介绍&#xff1a;Charles是著名的抓包工具&#x1f402;&#xff0c;可以抓取移动端与pc端网络访问&#x1f577;的所有数据。我们将使用它抓取我们与小程序交互的所有信息。&#x1f387;我们可以百度搜索Charles官网下载适用于自己系统的Charles安装包&#x1f…...

蓝桥杯倒计时 | 倒计时17天

作者&#x1f575;️‍♂️&#xff1a;让机器理解语言か 专栏&#x1f387;&#xff1a;蓝桥杯倒计时冲刺 描述&#x1f3a8;&#xff1a;蓝桥杯冲刺阶段&#xff0c;一定要沉住气&#xff0c;一步一个脚印&#xff0c;胜利就在前方&#xff01; 寄语&#x1f493;&#xff1a…...

【Spring Cloud Alibaba】7.Sentinel熔断器仪表盘监控

文章目录简介什么是 Sentinel控制台获取源码方式下载jar包方式启动访问服务配置项目&#xff0c;启用Sentinel完整配置测试简介 接下来我们通过Sentinel控制台来实现对服务消费者提供的熔断机制进行监控和控制&#xff0c;本操作先要完成之前的步骤&#xff0c;详情请参照【Sp…...

个人博客系统项目测试报告

项目背景介绍 背景&#xff1a;当在学习一项技能的时候&#xff0c;我们总会习惯通过博客来记录所学的知识点&#xff0c;方便后期遗忘时随时查看和快速复习。本次开发的Web网站程序便是为了更加轻量和方便地记录自己的学习笔记 概述&#xff1a;一个Web网站程序&#xff0c;…...

flutter安装自用笔记

参照文章&#xff1a; 开发环境搭建 Flutter环境配置步骤&#xff1a; 1.系统配置要求 2.Java环境 3.Flutter SDK 4.Android 开发环境一、系统配置要求 操作系统&#xff1a;Windows 7 SP1 或更高的版本&#xff08;基于 x86-64 的 64 位操作系统&#xff09; 磁盘空间&…...

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…...

大话软工笔记—需求分析概述

需求分析&#xff0c;就是要对需求调研收集到的资料信息逐个地进行拆分、研究&#xff0c;从大量的不确定“需求”中确定出哪些需求最终要转换为确定的“功能需求”。 需求分析的作用非常重要&#xff0c;后续设计的依据主要来自于需求分析的成果&#xff0c;包括: 项目的目的…...

Leetcode 3576. Transform Array to All Equal Elements

Leetcode 3576. Transform Array to All Equal Elements 1. 解题思路2. 代码实现 题目链接&#xff1a;3576. Transform Array to All Equal Elements 1. 解题思路 这一题思路上就是分别考察一下是否能将其转化为全1或者全-1数组即可。 至于每一种情况是否可以达到&#xf…...

React Native 导航系统实战(React Navigation)

导航系统实战&#xff08;React Navigation&#xff09; React Navigation 是 React Native 应用中最常用的导航库之一&#xff0c;它提供了多种导航模式&#xff0c;如堆栈导航&#xff08;Stack Navigator&#xff09;、标签导航&#xff08;Tab Navigator&#xff09;和抽屉…...

连锁超市冷库节能解决方案:如何实现超市降本增效

在连锁超市冷库运营中&#xff0c;高能耗、设备损耗快、人工管理低效等问题长期困扰企业。御控冷库节能解决方案通过智能控制化霜、按需化霜、实时监控、故障诊断、自动预警、远程控制开关六大核心技术&#xff0c;实现年省电费15%-60%&#xff0c;且不改动原有装备、安装快捷、…...

【Go】3、Go语言进阶与依赖管理

前言 本系列文章参考自稀土掘金上的 【字节内部课】公开课&#xff0c;做自我学习总结整理。 Go语言并发编程 Go语言原生支持并发编程&#xff0c;它的核心机制是 Goroutine 协程、Channel 通道&#xff0c;并基于CSP&#xff08;Communicating Sequential Processes&#xff0…...

【JavaSE】绘图与事件入门学习笔记

-Java绘图坐标体系 坐标体系-介绍 坐标原点位于左上角&#xff0c;以像素为单位。 在Java坐标系中,第一个是x坐标,表示当前位置为水平方向&#xff0c;距离坐标原点x个像素;第二个是y坐标&#xff0c;表示当前位置为垂直方向&#xff0c;距离坐标原点y个像素。 坐标体系-像素 …...

多种风格导航菜单 HTML 实现(附源码)

下面我将为您展示 6 种不同风格的导航菜单实现&#xff0c;每种都包含完整 HTML、CSS 和 JavaScript 代码。 1. 简约水平导航栏 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport&qu…...

免费PDF转图片工具

免费PDF转图片工具 一款简单易用的PDF转图片工具&#xff0c;可以将PDF文件快速转换为高质量PNG图片。无需安装复杂的软件&#xff0c;也不需要在线上传文件&#xff0c;保护您的隐私。 工具截图 主要特点 &#x1f680; 快速转换&#xff1a;本地转换&#xff0c;无需等待上…...

uniapp 开发ios, xcode 提交app store connect 和 testflight内测

uniapp 中配置 配置manifest 文档&#xff1a;manifest.json 应用配置 | uni-app官网 hbuilderx中本地打包 下载IOS最新SDK 开发环境 | uni小程序SDK hbulderx 版本号&#xff1a;4.66 对应的sdk版本 4.66 两者必须一致 本地打包的资源导入到SDK 导入资源 | uni小程序SDK …...