算法 双指针技巧

文章目录

  • 双指针
  • [leetcode167 两数之和](https://leetcode.cn/problems/two-sum-ii-input-array-is-sorted/description/)
    • 分析
    • 题解
  • [leetcode88 合并两个有序数组](https://leetcode.cn/problems/merge-sorted-array/description/)
    • 分析
    • 题解
  • [leetcode142 环形链表](https://leetcode.cn/problems/linked-list-cycle-ii/description/)
    • 分析
    • 非公式分析
    • 题解
  • [leetcode76 最小覆盖子串](https://leetcode.cn/problems/minimum-window-substring/)
    • 分析
    • 题解

双指针

双指针用于处理数组和链表等线性结构。同时用2个指针遍历有序的数据结构,减少时间复杂度。

leetcode167 两数之和

分析

由于数组是有序的,因此两个指针,一个从前向后遍历,一个从后往前遍历,可以在O(n)时间复杂度完成查询。
假设结果为[i, j]。那么左指针遍历到i时,如果右指针大于j,那么和偏大,右指针左移,不会出现左指针右移的情况。直到右指针走到j,返回结果。右指针遍历到j也是同理,因此不会出现左指针大于i,右指针小于j的情况。

题解

class Solution {public int[] twoSum(int[] numbers, int target) {int first = 0; // 第一个指针int last = numbers.length - 1;  // 第二个指针while (first < last) {int sum = numbers[first] + numbers[last];if (sum == target) {return new int[]{first + 1, last + 1};} else if (sum < target) {first++;} else {last--;}}return new int[]{-1, -1};}
}

leetcode88 合并两个有序数组

分析

2个有序数组,每个数组用一个指针遍历。因为合并结果存在nums1数组,而nums1数组的前半部分有值,后半部分是空的。所以与正向双指针相比,逆向双指针更快。

题解

class Solution {public void merge(int[] nums1, int m, int[] nums2, int n) {int tail = m + n - 1;int i = m - 1; // 第一个指针int j = n - 1; // 第二个指针int cur;while (i >= 0 || j >= 0) {if (i < 0) {cur = nums2[j];j--;} else if (j < 0) {cur = nums1[i];i--;} else if (nums1[i] > nums2[j]) {cur = nums1[i];i--;} else {cur = nums2[j];j--;}nums1[tail] = cur;tail--;}}
}

leetcode142 环形链表

分析

在这里插入图片描述
假设slow指针和fast指针均从head节点出发,每次slow移动1个节点,fast移动2个节点。它们相遇时的位置如图。a表示头节点到入环点的距离,b表示入环点到相遇点的距离,c表示相遇点到入环点的距离。
slow = a + b, fast = a + n(b + c) + b
其中n表示fast节点在环中多走的次数。
fast = 2 * slow,则
a + n(b + c) + b = 2(a + b),变换得到
(n - 1)(b + c) + c = a,这个等式意味着,分别从相遇点出发和从头结点出发的两个节点终会在入环点相遇。

非公式分析

现在fast和slow在相遇点相遇,slow走过的距离是x。此时再来一个节点ptrslow的速度从头结点走到相遇点,走过的距离也是x。那么slow在这期间走过的距离是多少?是2x,恰好是之前fast走过的距离。ptrslow相遇的位置恰好是slowfast相遇的位置。
由于slowptr在环里相遇,它们速度又相同,因此它们在环里的每个位置都相遇,自然包括入环点。

题解

public class Solution {public ListNode detectCycle(ListNode head) {ListNode slow = head;ListNode fast = head;while (fast != null && fast.next != null) {fast = fast.next.next; // 快指针slow = slow.next;  // 慢指针if (slow == fast) {fast = head; // 不浪费指针,fast表示ptrwhile (fast != slow) {fast = fast.next;slow = slow.next;}return fast;}}return null;}
}

leetcode76 最小覆盖子串

分析

左右指针在同一个字符数组上,分别表示子串的左右边界。由于要求最小子串,因此先用右指针保证覆盖子串内容,再停止右指针并用左指针压缩子串范围。

题解

    public static String minWindow(String s, String t) {char[] sArray = s.toCharArray();char[] tArray = t.toCharArray();int[] cnt = new int[128];int count = 0;for (char c : tArray) {cnt[c]++;count++;}int start = -1;int end = sArray.length;int l = 0;for (int r = 0; r < sArray.length; r++) {if (--cnt[sArray[r]] >= 0) {count--;}while (count == 0) {if (++cnt[sArray[l]] > 0) {if (r - l < end - start) {end = r;start = l;}count++;}l++;}}return start == -1 ? "" : s.substring(start, end + 1);}
}

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

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

相关文章

DevOps工程技术价值流:制品库Nexus与Harbor的实战探索

制品库作为DevOps价值流中的一个关键环节&#xff0c;其重要性日益凸显。制品库&#xff0c;作为存储和管理软件开发过程中产生的各种制品&#xff08;如代码包、镜像、配置文件等&#xff09;的仓库&#xff0c;是连接开发、测试、部署等多个环节的桥梁。它不仅能够实现制品的…

R9000P键盘失灵解决办法

问题描述 突然&#xff0c;就是很突然&#xff0c;我买的R9000P 2024不到三个月&#xff0c;键盘突然都不能用了&#xff0c;是所有键盘按键都无效的那种。&#xff08;可以使用外接键盘&#xff09; 解决办法 我本科室友说的好哈&#xff0c;全坏全没坏。 &#xff08;该解…

潜在狄利克雷分配LDA 算法深度解析

引言 潜在狄利克雷分配&#xff08;Latent Dirichlet Allocation, LDA&#xff09;是一种广泛应用于文本挖掘和信息检索领域的主题模型。它能够从文档集合中自动发现隐藏的主题结构&#xff0c;为理解大规模文本数据提供了强有力的工具。本文将着重讲解 LDA 的核心理论&#x…

sentinel学习笔记6-限流降级(上)

本文属于sentinel学习笔记系列。网上看到吴就业老师的专栏&#xff0c;写的好值得推荐&#xff0c;我整理的有所删减&#xff0c;推荐看原文。 https://blog.csdn.net/baidu_28523317/category_10400605.html sentinel 实现限流降级、熔断降级、黑白名单限流降级、系统自适应…

全面解析 Kubernetes 流量负载均衡:iptables 与 IPVS 模式

目录 Kubernetes 中 Service 的流量负载均衡模式 1. iptables 模式 工作原理 数据路径 优点 缺点 适用场景 2. IPVS 模式 工作原理 数据路径 优点 缺点 适用场景 两种模式的对比 如何切换模式 启用 IPVS 模式 验证模式 总结 Kubernetes 中 Service 的流量负载…

每日十题八股-2024年12月19日

1.Bean注入和xml注入最终得到了相同的效果&#xff0c;它们在底层是怎样做的&#xff1f; 2.Spring给我们提供了很多扩展点&#xff0c;这些有了解吗&#xff1f; 3.MVC分层介绍一下&#xff1f; 4.了解SpringMVC的处理流程吗&#xff1f; 5.Handlermapping 和 handleradapter有…

蓝桥杯嵌入式备赛教程(1、led,2、lcd,3、key)

一、工程模版创建流程 第一步 创建新项目 第二步 选择型号和管脚封装 第三步 RCC使能 外部时钟&#xff0c;高速外部时钟 第四步晶振时钟配置 由数据手册7.1可知外部晶振频率为24MHz 最后一项设置为80 按下回车他会自动配置时钟 第五步&#xff0c;如果不勾选可能程序只会…

2.4 设备管理

文章目录 设备管理概述设备管理技术磁盘调度 设备管理概述 设备管理是操作系统中最繁杂、与硬件关系紧密的部分。 设备可以按照数据组织、资源分配、数据传输率分类。 数据组织&#xff1a;分为块设备&#xff08;ex. 磁盘&#xff09;、字符设备(ex. 打印机)。资源分配&#…

网络安全渗透有什么常见的漏洞吗?

弱口令与密码安全问题 THINKMO 01 暴力破解登录&#xff08;Weak Password Attack&#xff09; 在某次渗透测试中&#xff0c;测试人员发现一个网站的后台管理系统使用了非常简单的密码 admin123&#xff0c;而且用户名也是常见的 admin。那么攻击者就可以通过暴力破解工具&…

PSDK的编译与ROS包封装

本文档讲述在NIVIDIA开发板上使用大疆提供的Payload SDK获取无人机实时GPS信息的方法&#xff0c;以及基于Payload SDK发布ROS GPS话题信息的方法。 文章目录 0 实现目标1 Payload SDK1.1 PSDK 源码的编译1.2 PSDK 的使用 2 遥测数据的读取2.1 示例代码结构2.2 读取机载GPS信息…

模型 课题分离

系列文章 分享 模型&#xff0c;了解更多&#x1f449; 模型_思维模型目录。明确自我与他人责任。 1 课题分离的应用 1.1课题分离在心理治疗中的应用案例&#xff1a;李晓的故事 李晓&#xff0c;一位28岁的软件工程师&#xff0c;在北京打拼。他面临着工作、家庭和感情的多重…

大恒相机开发(3)—大恒相机工业检测的实际案例

大恒相机工业检测的实际案例 工业检测的实际案例图像采集性能优化技巧工业环境下的稳定性 工业检测的实际案例 以下是一些使用大恒相机进行工业检测的实际案例&#xff1a; 多特征光学成像系统&#xff1a; 在这个案例中&#xff0c;使用大恒相机构建了一个全方位、多特征的图…

go官方日志库带色彩格式化

go默认的 log 输出的日志样式比较难看&#xff0c;所以通过以下方式进行了美化和格式化&#xff0c;而且加入了 unicode 的ascii码&#xff0c;进行色彩渲染。 package mainimport ("fmt""log""os""runtime""strings""…

Linux shell脚本用于常见图片png、jpg、jpeg、webp、tiff格式批量转PDF文件

Linux Debian12基于ImageMagick图像处理工具编写shell脚本用于常见图片png、jpg、jpeg、webp、tiff格式批量转PDF文件&#xff0c;”多个图片分开生成多个PDF文件“或者“多个图片合并生成一个PDF文件” 在Linux系统中&#xff0c;使用ImageMagick可以图片格式转换&#xff0c…

【C++语言】多态

一、多态的概念 多态的概念&#xff1a;通俗来说&#xff0c;就是多种形态&#xff0c;具体点就是去完成某种行为&#xff0c;当不同的对象去完成时会产生出不同的状态。 我们可以举一个例子&#xff1a; 比如买票这种行为&#xff0c;当普通人买票时&#xff0c;是全价买票&am…

Centos7配置webrtc-streamer环境

Centos7配置webrtc-streamer环境 安装webrtc-streamer0.7版本 升级gdb 1、yum安装2、查看gdb版本3.下载待升级的gdb版本4.QA 1、预编译的时候报错no acceptable C compiler found in $PATH2、make的时候报错[all-bfd] Error3、make的时候报错 升级GCC 1.源码编译升级gcc9.3.0…

【AIGC】ChatGPT 结构化 Prompt 的高级应用

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: AIGC | ChatGPT 文章目录 &#x1f4af;前言&#x1f4af;标识符的使用&#xff08;Use of Identifiers&#xff09;1. #2. <>3. - 或 4. [] &#x1f4af;属性词的重要性和应用应用场景 &#x1f4af;具体模块…

OpenEuler 22.03 安装 flink-1.17.2 集群

零&#xff1a;规划 本次计划安装三台OpenEuler 22.03 版本操作系统的服务器&#xff0c;用于搭建 flink 集群。这里使用flink1.17.2 的原因&#xff0c;是便于后续与springboot的整合 服务器名IP地址作用其他应用flink01192.168.159.133主jdk11、flink-1.17.2flink02192.168.…

Docker 安装 禅道-21.2版本-外部数据库模式

Docker 安装系列 1、拉取最新版本&#xff08;zentao 21.2&#xff09; [rootTseng ~]# docker pull hub.zentao.net/app/zentao Using default tag: latest latest: Pulling from app/zentao 55ab1b300d4b: Pull complete 6b5749e5ef1d: Pull complete bdccb03403c1: Pul…

车载网关性能 --- GW ECU报文(message)处理机制的技术解析

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 所谓鸡汤,要么蛊惑你认命,要么怂恿你拼命,但都是回避问题的根源,以现象替代逻辑,以情绪代替思考,把消极接受现实的懦弱,伪装成乐观面对不幸的…