关于双指针的一些思考

指针今天刷leetcode时,一时兴起,打算整理一下关于双指针的一些思路(胡写一通),方便后续复习思路时进行查阅。

双指针(以下是一些个人总结,有误请谅解)

所谓双指针,就是利用两个指针,在数组或字符串中进行一系列操作,以实现减小时间复杂度等操作。

笔者第一次了解到双指针,就是在刷题过程中遇到在一列长度为n的数组中确定倒数第k的数字,一开始的思路是,需找到尾节点,并统计总长度(此处不考虑使用库函数等),在利用第二次遍历查询到需要的节点,虽然时间复杂度也为o(n)。但使用双指针可以节省一定时间,尤其是查找倒数n/2个时(假设一开始不知道数组长度)。

下面是使用双指针进行查找倒数第k个数的思路:

step1:定义两个指针*p1,*p2,指向数组开头;//假定前面的为p1,后面的为p2

step2:向后移动k次p2;

step:同时向后移动p1,p2,直至p2到达数组末尾为'\0'。此时p1所指向的数为倒数第k个数。

一些关于双指针的例题:

力扣https://leetcode-cn.com/problems/squares-of-a-sorted-array/力扣https://leetcode-cn.com/problems/rotate-array/一些补充:

此外,双指针在实现字符串逆转的操作,即两个指针分别指向字符串的开头和末尾,进行交换,再同时向中心靠近。

后来刷到了一题链表的双指针操作题,原本刷到的都是关于数组或字符串的,是我理解“真实”的双指针,但是遇到链表时,便不好操作。因为链表无法直接获取第n个节点这类操作,只能通过顺序遍历获取。

因此对于链表的双指针,我们同样设置两个结构体指针,也命名为*p1,*p2吧。这里我觉得称为快慢指针也不为过(我后来确认了一下就是叫快慢指针法...),可以通过快慢指针应用一次遍历(在不知道链表节点数量前提下)获取链表的中间节点,用我自己的话概括就是每一次慢移动一次,快移动两次,当快指针到达链表尾部,此时慢节点指向的即为中间节点。(对于链表操作设置循环时,需要重点关注节点或后节点是否为空!!!容易遗忘)

力扣https://leetcode-cn.com/problems/middle-of-the-linked-list/这些都是笔者做到的一些有关双指针的题,供大家学习。感觉对于加深双指针的理解和应用有帮助。后面可能还会进行一些补充,后面也会抽空写写其他的一些刷题知识点整理。

又来补充一点:
关于双指针在算法题中的应用:滑动窗口,个人感觉整体思路大致相同,在另一篇文章中Leetcode刷题笔记中有一题基础题供大家学习。Leetcode 刷题笔记 Day1(100热题using C++)_想要有书读的博客-CSDN博客Leetcode 刷题笔记 Day1(100热题using C++)https://blog.csdn.net/m0_48935485/article/details/125821554?spm=1001.2014.3001.5501

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值