当前位置: 首页 > article >正文

优选算法--快乐数(快慢指针)循环链表

文章目录

  • 1.快乐数---快慢指针的应用
  • 2.环形链表142(师兄版)

1.快乐数—快慢指针的应用

题目描述:

  • 1)给定一个数字,计算这个数字每一个数位上面的这个数的平方和,不断的计算下去,直到这个数子的平方和是1,那么这个数字就是快乐数;
  • 2)如果最后陷入循环,那么这个平方和就不会是1,就是上面的两个情况;
  • 3)我们使用快慢指针解决这个题目,主要是这个无限循环是类似于我们之前学习的这个循环链表的这个解法,因此我们把这个无限循环就理解为这个链表的循环;
  • 4)我们定义一个函数,这个函数就是求解一个数字的每一个数位上面的数的平方和;
  • 5)在我们的这个主函数里面,我们让这个慢指针指向第一个数字,快指针和慢指针的这个指向不可以是一样的,否则就无法进行下面的这个循环的过程;
  • 6)因此我们让这个快指针指向第二个数据,让后快指针走两步,慢指针走一步,看看这个最后的结果会不会是1;用这个返回值决定我们的这个数字是不是快乐数;

image-20241119084027433

代码示例:

image-20241119083914576

2.环形链表142(师兄版)

这个因为上面的题目是用到了这个环形链表的这个思想的,因此在这个地方,我重新把之前写的那道环形链表的题目重新回顾了一下;

1)判断这个链表里面是不是存在这个环,如果是的话,需要返回这个环的入口节点,否则返回null;
2)我们首先需要判断这个链表里面是不是存在这个环,然后去确定这个环里面的这个入口节点;
3)如何判断这个链表里面是不是存在这个环,我们使用的就是这个快慢指针的方法:
让这个慢指针一次走一步,快指针一次走两步,他们一定会进入这个环,而且一定会在某一个换里面的节点的位置相遇;
相遇就说明这个链表里面是存在这个环的;进而去判断这个入口节点;
4)入口节点的判断:
首先定义这个1指向我们的这个相遇的地方(使用指针进行标记)
然后定义一个指针b指向我们的这个链表的头结点;
接着就是两个指针同时移动,一次移动一步,相遇的位置就是我们的这个环的入口节点;
5)为什么这个a,b同时开始走,这个相遇的地方就是我们的这个环的入口节点呢?
其实这个问题是涉及到我们的这个数学的严谨推导的,但是这个结论确实是正确的,感兴趣的可以自行这个数学推理的这个过程(其实就是我们利用这个慢指针的这个路程==快指针的路程/2进行列等式;
6)下面的这个就是我们进行这个数学推理的这个图示,右边就是这个对应的等式的计算过程,我们的这个x表示的就是头结点到这个入口节点的这个路程,n(y+z)就是我们的这个快指针在这个环里面不断的转圈圈形成的这个循环,最后回到了这个相遇节点,这个时候减去y就是我们的这个相遇节点的位置;
image-20241119093124005

image-20241119091240122

代码解读:

1)首先就是判断这个链表里面是不是存在这个环嘛;
2)我们定义的这个slow和fast都是开始的时候指向这个链表里面的这个头结点的;
3)进入我们的这个循环之后,就是我们的这个慢指针一次走一步,快指针一次走两步,直到两个相遇,这个时候就证明我们的这个链表里面是存在这个环的;
4)在存在这个环的基础上面,我们使用这个a指向我们的这个相遇的地方,b指向我们的这个链表的头结点,这个时候两个指针一次走一步,相遇的时候就是我们的这个链表里面的这个环的入口节点;
5)因为相遇的时候我们的这个ab指向的这个位置是一样的,因此这个时候我们返回a,b任意一个都是可以的,这个就是我们的这个链表里面的这个环的入口节点;

时候我们返回a,b任意一个都是可以的,这个就是我们的这个链表里面的这个环的入口节点; |

image-20241119091118746


http://www.kler.cn/a/402151.html

相关文章:

  • vue3项目执行npm install下载依赖报错问题排查方法
  • Linux system-timesyncd同步机制梳理
  • Apache和HTTPS证书的生成与安装
  • D3中颜色的表示方法大全
  • 反向代理模块
  • [代码随想录Day16打卡] 找树左下角的值 路径总和 从中序与后序遍历序列构造二叉树
  • 《物理学进展》
  • koa-body 的详细使用文档
  • Node.js 版本管理的最终答案 Volta
  • windows系统中实现对于appium的依赖搭建
  • Android CALL按键同步切换通话界面上免提和听筒的图标显示
  • Linux进阶:用户、用户组、权限
  • Vue实现响应式导航菜单:桌面端导航栏 + 移动端抽屉式菜单
  • HarmonyOS NEXT应用元服务开发Intents Kit(意图框架服务)习惯推荐方案概述
  • 批量将当前目录里的所有pdf 转化为png 格式
  • 鸿蒙实战:使用显式Want启动Ability
  • 【C++课程学习】:继承:默认成员函数
  • DBSCAN聚类——基于密度的聚类算法(常用的聚类算法)
  • HarmonyOS4+NEXT星河版入门与项目实战-------- Text 组件与国际化实现
  • 魔乐社区平台下载书生模型
  • DNS协议详解:原理、查询过程及常见问题
  • How to install rust in Ubuntu 24.04
  • NAT网络地址转换——Easy IP
  • git操作总结
  • 在Unity中实现电梯升降功能的完整指南
  • 关于selenium元素找不到的问题(Unable to locate element: {“method“:“xpath“,“selector“:“)