引言
非常荣幸入围了 csdnTOP300年度博主的遴选
,这也是我第一次入选这么大的比赛,借此机会,想对2024年做一个总结和对2025年的规划
1.命运齿轮转动之刻
时光飞逝,岁月如梭,转眼间已经与csdn相识了7个月,第一篇博客也只是浅浅记录了一下知识点,并没有介绍自己,趁着新年佳节,想弥补一下当初的遗憾,也为自己的未来做好规划
我是一名211大学的大二学生,专业为软件工程,经历了高考的残酷斗争,我只想报复性地玩耍,然而在平淡的大学生活中,危机感始终笼罩着我,学校的课程终究只是纸上谈兵,并不系统化,所以在大一下时,我决定了我要去 学技术
,做真正的IT人
!在注册了csdn账号并发布了第一篇博客后,命运齿轮开始了转动
梦开始的地方
:第一篇博客
2.砥砺前行,不畏艰巨之路
即使有了目标,但道路上的艰巨无一不令人叹息,即使我不再拘泥于拔高绩点,想去探索编程未来的边界,我又如何能跨越荆棘呢?荀子曰:“锲而舍之,朽木不折;锲而不舍,金石可镂。”
,坚持,就是普通人的良药。我在csdn成长的道路上就遇到过不少曲折,但在 csdn无数的大佬帮助下,也成功披荆斩棘
。
1.红与黑的比拼,红黑树与我的相遇
相信对大部分学计算机的大佬们来说,红黑树在结构复杂方面绝对占有一席之地,当时懵懂无知的我遇到它时,只想着打退堂鼓,但 在csdn查阅了相关资料后
,自己进行了思考,也逐渐了解了其中的一些奥秘,并尝试着自己写出谜底,红黑树的奇妙结构无一不展示着 编程的魅力与前人的智慧
。
我也来重温一下红黑树的插入准则。
约定:cur为当前节点,p为父节点,g为祖父节点,u为叔叔节点
-
- 情况一: cur为红,p为红,g为黑,u存在且为红
解决方式:将p,u改为黑,g改为红,然后把g当成cur
,继续向上调整。
- 情况一: cur为红,p为红,g为黑,u存在且为红
-
2.情况二(单旋+变色): cur为红,p为红,g为黑,u不存在/u存在且为黑 (
左左和右右
)
细分就是:(1) g->left = p, p->left= cur;左左
(2)g->right=p,p->right=cur;右右
p为g的左孩子,cur为p的左孩子,则进行右单旋转
;
相反, p为g的右孩子,cur为p的右孩子,则进行左单旋转
p、g变色--p变黑,g变红
- 3.情况三(双旋+变色): cur为红,p为红,g为黑,u不存在/u存在且为黑 (
左右和右左
)
细分就是:(1)g->left=p,p->right=cur;左右
(2)g->right=p,p->left=cur;右左
p为g的左孩子,cur为p的右孩子,则针对p做左单旋转
;
相反, p为g的右孩子,cur为p的左孩子,则针对p做右单旋转
则转换成了情况2!!!!!,然后再用情况2的旋转处理一下就行了
(这点真是异常巧妙,把情况3转换为情况2,可以有效解决新问题)
代码如下:
while (parent&&parent->col == RED)//parent为黑不需要调整,如果cur变成root,parent就不存在退出循环
{
node* grandparent = parent->_parent;//祖父一定存在,因为只有根节点是没有祖父的,而根节点一定是黑色的
if (parent==grandparent->_left)
{
// g
// p u
node* uncle = grandparent->_right; //父亲在左则叔叔在右
if (uncle && uncle->col == RED) //情况一.如果叔叔存在且为红色
{
//变色
parent->col = uncle->col = BLACK;
grandparent->col = RED;
//重置cur,parent,继续向上处理
cur = grandparent;//变为祖父
parent = cur->_parent;
}
else //叔叔不存在或为黑色,旋转加变色
{
// g
// p
// c
if (cur == parent->_left) //情况二.单旋
{
rotateR(grandparent);
parent->col = BLACK;
grandparent->col = RED;
}
// g
// p
// c
else //情况三.cur==parent->_right,双旋
{
rotateL(parent);//经历一次左旋后变成情况二!!!!!!!!!!!(cur和parent换位置)
rotateR(grandparent);
cur->col = BLACK;
grandparent->col = RED;
}
break;//调整一次就结束了,所以经历过旋转后不需要重置cur,parent,grandparent
}
}
else
{
// g
// u p
//
node* uncle = grandparent->_left; //父亲在右则叔叔在左
if (uncle && uncle->col == RED)
{
parent->col = uncle->col = BLACK;
grandparent->col = RED;
//
cur = grandparent;
parent = cur->_parent;
}
else
{
// g
// u p
// c
if (cur == parent->_right)
{
rotateL(grandparent);
parent->col = BLACK;
grandparent->col = RED;
}
else
{
// g
// u p
// c
rotateR(parent);
rotateL(grandparent);
cur->col = BLACK;
grandparent->col = RED;
}
break;//调整一次就结束了,所以经历过旋转后不需要重置cur,parent,grandparent
}
}
每次重新复盘,都有不一样的收获
2.过往与未来的相遇,回溯时光的震撼
在学完了数据结构和部分c++内容后,我开始尝试接触算法题,每次做不出题时的 焦虑与烦躁
,都会在完成解题后化作 酣畅与喜悦
,这里我也要感谢csdn平台,很多次在我手足无措时,只要点开csdn,就有无数大佬发布他们自己的解题思路,很多次都使迷茫的我瞬间醍醐灌顶
虽然目前只写了80多道题,但我还会继续加油滴
其中最令我印象深刻的就是不同路径|||啦,让我真正感受到递归的魅力。
这个题就是走迷宫的类型,对于第一次,没学过任何算法的我,写了40多分钟才完成,可以说是里程碑的一题,csdn大佬的回溯入门文章也给了我很大的启发,希望我之后也能写出自己的迷宫小游戏。
class Solution {
public:
int num=0;
int row=0;
int line=0;
bool judge(vector<vector<bool>>&check)
{
for(int i=1;i<row+1;i++)
{
for(int j=1;j<line+1;j++)
{
if(check[i][j]==false)//有格子没走过
return false;
}
}
return true;//所有格子都走过
}
void dfs(vector<vector<int>>& square,int i,int j,vector<vector<bool>>&check)
{
if(square[i][j]==2) //走到终点
{
if(judge(check))
{
num++; //路径数量++;
}
}
if((square[i][j+1]==0||square[i][j+1]==2)&&!check[i][j+1])//判断右
{
check[i][j+1]=true;
dfs(square,i,j+1,check);
check[i][j+1]=false;//恢复现场
}
if((square[i][j-1]==0||square[i][j-1]==2)&&!check[i][j-1])//判断左
{
check[i][j-1]=true;
dfs(square,i,j-1,check);
check[i][j-1]=false;//恢复现场
}
if((square[i+1][j]==0||square[i+1][j]==2)&&!check[i+1][j])//判断下
{
check[i+1][j]=true;
dfs(square,i+1,j,check);
check[i+1][j]=false;//恢复现场
}
if((square[i-1][j]==0||square[i-1][j]==2)&&!check[i-1][j])判断上
{
check[i-1][j]=true;
dfs(square,i-1,j,check);
check[i-1][j]=false;//恢复现场
}
}
int uniquePathsIII(vector<vector<int>>& grid) {
row=grid.size();
line=grid[0].size();
int position_row=0;
int position_line=0;
vector<vector<bool>>check(row+2,vector<bool>(line+2,false));
vector<vector<int>>square(row+2,vector<int>(line+2,3));
for(int i=1;i<row+1;i++)
{
for(int j=1;j<line+1;j++)
{
square[i][j]=grid[i-1][j-1];
if(square[i][j]==1||square[i][j]==-1)
{
if(square[i][j]==1)
{
position_row=i;//找入口的行
position_line=j;//找入口的列
}
check[i][j]=true; //
}
}
}
dfs(square,position_row, position_line,check);
return num;
}
};
3.漫漫长路,沿途总有收获之时
在csdn发文7个月,也第一次迎来了我的年度报告(嘻嘻)
一年的旅行,让我收获颇丰,我与csdn共奋战!
一年的努力,让我收获了10033次点赞,5477次评论,8002次收藏,476次代码分享
,也成功获得了 c++领域新星创作者的身份
我也在1024征文活动中得到了属于自己的第一份实体回报:
在其他社区中也取得了一点点小成就:
2024年已经画上了句号,回望过去的一年,虽然充满了挑战,但也让我收获了成长与启示。每一次的跌倒都成就了更加坚韧的我,每一份努力都为新的一年奠定了坚实的基础。感谢过去一年的所有经历,它们塑造了今天的我。随着2025年的到来,我将继续以更加坚定的步伐,走向更加广阔的天地。
愿新的一年里,我们都能带着对生活的热爱和对未来的期待,勇敢前行,创造属于自己的辉煌,与csdn平台一起奋斗。