
🔥近津薪荼:个人主页
🎬个人专栏:《c语言基础知识详解》《c++基础知识详解》《Linux操作系统及网络基础知识分享》《近津薪荼的算法日迹》
✨流水不争先,争的是滔滔不绝
⭐️树木不争高,争的是生生不息
本期博客知识点导图
1.上期优解思路参考代码
cpp
class Solution {
public:
void duplicateZeros(vector<int>& arr) {
int cur=0,dest=-1,n=arr.size();
//找位置
while(cur<n)
{
if(arr[cur]) //判断cur
dest++;
else
dest+=2;
if(dest>=n-1)//判断停止
break;
cur++;
}
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--;
}
}
}
};
有不懂的点,大家可以在评论区讨论一下,如果是第一次接触这种模拟加双指针的题目发蒙很正常,接触多了就好了。道阻且长,行则将至,一起加油吧。
如果参考代码有错误,欢迎大家批评指正!
2.本期题目解析

每一次操作,该数被替换成各位数字的平方和
重复操作最后一定会得到一个循环,有且只有如图的两种情况(核心思想)

返回值是bool类型。
3.思路讲解
3.1联想链表
看到这里,有数据结构基础的同学,可能一眼就想到了循环链表,以及一道经典的题目:判断链表是否带环,当然没写过也没关系~
要判断链表是否带环,第一个想到的就应该是快慢双指针,由于链表是线性表,如果指针能够相遇,那么链表一定带环。
就比如一个线性跑道(单向通行的一条路),一辆快车和一辆慢车在上边行驶,如果跑道带环,进入环之后,快车和慢车就一定会相遇(套圈)。
图例:

3.2快慢双指针
我们之前说过,双指针是一种思想,不一定就是指针,当然在判断链表是否带环的题目中,快慢双指针就是指向链表节点的指针,在之前的两道题中,双指针是数组下标,而在本题中,双指针将被抽象成一个具体的数据(解题关键)。
3.3代码思路
与环相关的问题,想快慢双指针。
一般情况下先判断是否成环。
既然题目告诉我们必然成环,那么我们可以跳过这一步,直接来判断环里是否为1即可。
逻辑:
1.定义快慢双指针(每次快指针比慢指针**多操作一次,**fast算两次,slow算一次)。
2.判断快慢双指针相遇时,两个数值是否为1。
上一期的题目,看完解析,一定一定要自己下去敲一遍,不然约等于白看哦~
4.预告
下期要讲解的题目是:
我们下期再见~
