首页 > 编程语言 >双指针算法学习总结以及实现案例

双指针算法学习总结以及实现案例

时间:2022-10-16 21:11:52浏览次数:75  
标签:slow ListNode int fast next 案例 算法 指针

双指针算法简介:指的是在遍历对象的过程中,不是普通的使用单个指针进行访问,而是使用两个相同方向(快慢指针)或者相反方向(左右指针)的指针进行扫描,从而达到相应的目的。换言之,双指针法充分使用了数组有序这一特征,从而在某些情况下能够简化一些运算。

具体实现案例如下:

第一类:左右指针

  leetcode.125-验证回文串,全ac代码如下:

class Solution{//功能实现函数
public:
         bool isPalindrome(string s){
int start=0;i int end=s.size()-1;
while(start<end){
while(start<end&&!isalum(s[start]))//start位置如果是字母数字字符则向左移动
       start++;
while(start<end&&!isalnum(s[end]))//同理满足条件时end移动
       end--;
if(tolower(s[end])!=tolower(s[start]))//小写字母不同则返回false
   return false;
start++; end--;
}
return false;
  } 
};

 代码分析:回文是双指针算法中比较常见的一种类型,不难发现回文字符串是对称分布的,因此初始化两个移动速度相同的指针遍历字符串即可。

第二类:快慢指针

  (1)leetcode.19-删除链表的倒数第N个结点(比较明显的快慢指针)全ac代码如下:

class Solution {
public:
ListNode* removeNthFromEnd(ListNode* head, int n) {
ListNode* l=new ListNode(0, head);//new一个数值为0的结点作为头结点
ListNode* fast=head; ListNode* slow=l; ListNode* ans;
for (int i=0;i<n;i++)
    fast=fast->next;//先移动快指针
while(fast){
slow=slow->next; fast=fast->next;//快指针不为空时,慢指针,快指针移动一个单位
}
slow->next=slow->next->next;
ans=l->next;
delete l;//删除new的头结点
return ans;
}
};

 代码分析:根据题意,要先找到链表的中间节点,再删除。因此不难想到双指针算法,初始化两个快慢指针,快指针先移动,然后每次都会比慢指针夺走一步,因此当快指针到结尾时慢指针指向位置正好是中间结点,delete掉然后slow指向slow->next->next即可。下图可以形象理解移动过程:

 

(2)leetcode.142-快乐数(不明显的快慢指针以及环型结构,做的时候一点也不快乐),全ac代码如下:

class Solution{
public:
       bool  isHappy(int n){
int fast=next(n);int slow=n;
while(fast!=slow&&fast!=1){
slow=next(slow); fast=next(next(fast));
}
return (fast==1);
}
public:
int next(int n){//写一个函数计算每一位数平方和
int x;
int sum=0;
while(n>0){
x=n%10;n=n/10;sum+=x*x;
      }
return sum;
   }
};

 代码分析:刚入手此题时其实想不到会成环。当仔细观察一个测试用例后会发现如果一个数每一位数的平方和无论是否会找不到1则会一直循环下去,因此成环,所以初始化两个快慢指针,如果存在1的话,快慢指针在一个环型结构中遍历总会相遇直到找到1或者快慢指针值相同。所以当fast和slow不相等且fast不是1时,因此分两种情况,一种是会一直走下去直到两个指针同时走到1,另外一种是由于快指针走得快所以当fast先到1时即可跳出循环,此时即为快乐数。

 

标签:slow,ListNode,int,fast,next,案例,算法,指针
From: https://www.cnblogs.com/curtain-cpp/p/16797160.html

相关文章

  • C++ Null 指针的使用
    原文链接:https://www.zhoubotong.site/post/85.html这里有必要说下关于空指针的使用注意事项,C++中,如果一个指针不指向任何数据,就称之为空指针,用NULL表示。注意,NULL......
  • 04 队列 | 数据结构与算法
    1.队列1.队列的概念队列:操作受限的线性表,只允许在一端进行元素的插入,另一端进行元素的删除空队列:不含有任何元素的队列队头和队尾:进行删除的一端叫队头front,进行插......
  • 算法之二分法
    目录算法简介之二分法(需要写的出来)一、简介二、什么是算法三、二分法算法简介之二分法(需要写的出来)一、简介关于算法我们只需要稍微了解一下就可以了,对于算法,刚入行的......
  • 递归与分治法实现快速排序算法
    ​本人CSDN链接:http://t.csdn.cn/Wt0Nm提示:首先了解并明白递归与分治法的快速排序文章目录 前言递归与分治法实现快速排序算法,输入一串以英文字符逗号隔开的数......
  • 【算法训练营day4】LeetCode24. 两两交换链表中的结点 LeetCode19. 删除链表的倒数第N
    【算法训练营day4】LeetCode24.两两交换链表中的结点LeetCode19.删除链表的倒数第N个结点LeetCode面试题02.07.链表相交LeetCode142.环形链表IILeetCode24.两两......
  • 【TSP问题】基于改进蜜蜂算法解决旅行商问题(Matlab代码实现)
    目录​​1蜜蜂优化算法​​​​1.1蜜蜂觅食机制​​​​1.2蜜蜂算法​​​​1.3流程​​​​2TSP问题 ​​​​3运行结果 ​​​​4结论​​​​5 Matlab代码实现......
  • 第二季:6.GC垃圾回收算法和垃圾收集器的关系?分别是什么请你谈谈【Java面试题】
    第二季:6.GC垃圾回收算法和垃圾收集器的关系?分别是什么请你谈谈【Java面试题】​​前言​​​​推荐​​​​6.GC垃圾回收算法和垃圾收集器的关系?分别是什么请你谈谈​​​......
  • 【Nuxt.js】案例练习入门
    SQL表/*NavicatPremiumDataTransferSourceServer:localhost_3306SourceServerType:MySQLSourceServerVersion:50549SourceHost:......
  • Leetcode 6207 -- dp/思维/双指针
    题目描述maxmin思路思维代码classSolution{funccountSubarrays(_nums:[Int],_minK:Int,_maxK:Int)->Int{letsegments=nums.split......
  • 第三课 算法
    1.什么事算法是解决一个问题采取的方法和步骤结论:同一个问题可能有多种不同的算法,不同的算法的工作量不一定相同2.算法的特性1.有穷性2.确定性3.有零个或多个输入4......