代码随想录算法【Day4】

Day4

1.链表的题目,要在草稿纸上模拟清晰后就简单了

2.双指针更加灵活的应用。

3.环形链表多练习。

24. 两两交换链表中的节点
class Solution {
public:ListNode* swapPairs(ListNode* head) {ListNode* _dummyHead = new ListNode(0); //虚拟头结点_dummyHead -> next = head;ListNode* cur = head;ListNode* pre = _dummyHead;ListNode* tmp;while(cur != NULL && cur -> next != NULL){tmp = cur -> next -> next;//三个步骤pre -> next = cur -> next; cur -> next -> next = cur;cur -> next = tmp;//更新值pre = cur;cur = tmp;}ListNode* result = _dummyHead->next;delete _dummyHead;return result;}
};
19.删除链表的倒数第N个节点

直接法:

class Solution {
public:ListNode* removeNthFromEnd(ListNode* head, int n) {//直接法,需要两次遍历ListNode* _hummyHead = new ListNode(0); //虚拟头结点_hummyHead -> next = head;ListNode* tmp = nullptr, *cur = _hummyHead; int count = 0; //记录节点个数if(cur -> next == NULL) return head;while(cur -> next != NULL){cur = cur -> next;count ++;}cur = _hummyHead;int m = count - n;//移动到要删除的节点的前一个位置while(m--){cur = cur -> next;}//删除操作if(cur -> next -> next != nullptr) tmp = cur -> next ->next;delete cur -> next;cur -> next = tmp;return _hummyHead -> next;}
};

第一次写,没有加“if(cur -> next == NULL) return head;”这句,程序一直报错,在这里我debug了很久。

要注意,cur -> next为nullptr的话,cur -> next -> next 就是非法的。

双指针法

class Solution {
public:ListNode* removeNthFromEnd(ListNode* head, int n) {//快慢指针,只用遍历一遍就可以删除节点ListNode *_hummyHead = new ListNode(0);_hummyHead -> next = head;ListNode *slow = _hummyHead, *fast = _hummyHead;//先正常写,然后判断边界情况while (n --){fast = fast -> next;}while(fast -> next != nullptr){slow = slow -> next;fast = fast -> next;}//删除节点ListNode *tmp = slow -> next;slow -> next = tmp -> next;delete tmp;return _hummyHead -> next;}
};
面试题 02.07. 链表相交

有点类似模拟题,思路清晰后挺简单的。

题目示例里面提到的,“题目条件如果两个链表相交则不能为 0”,意思是,0代表了NULL。

class Solution {
public:ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {//相交的节点指地址是相同的,值相同的节点不一定地址相同ListNode* curA = headA;ListNode* curB = headB;int lenA = 0, lenB =0;while(curA != NULL){lenA ++;curA = curA -> next;}while(curB != NULL){lenB ++;curB = curB -> next;}curA = headA;curB = headB;//让curA成为最长链表的头if(lenA < lenB){swap(lenA, lenB);swap(curA, curB);}int gap = lenA - lenB;//让两表对齐while(gap --){curA = curA -> next;}while(curA != curB && curA != nullptr){curA = curA -> next;curB = curB -> next;}return curA;}
};
142.环形链表II

1.如何判断链表有环?

快慢指针相遇

2.假如慢指针每次移动一步,快指针每次移动两步,会不会存在这样的一个情况,即快慢指针永远无法相遇?

可以这样来看,慢指针相对于快指针静止,快指针每次相对移动一步来遇到慢指针,所以不存在永远无法相遇的情况。

3.如何判断快慢指针一定会相遇?

假如快指针每次移动5步,慢指针每次移动2步,以3步为单位的相对移动。

本质上是看以3步为单位的移动,是否一定能遍历环上的所有节点

所以只有当环长L不是3的倍数时才能相遇

4.环的入口怎么找?

快慢指针的运动如下图所示:

假设快慢指针在环中的某一点相遇,设:

①slow = x + y

(而不是 slow = x+y+n(y+z),因为慢指针被快指针追上的时候,慢指针一定在走第一圈)

②fast = x + y + n(y+z)

因为fast = 2 * slow

有等式: 2 * (x + y) = x + y + n(y +z)

得到:x = n(y + z) - y,整理得:③x = (n - 1)(y + z) + z,其中n ≥ 1

由③式可知,让慢指针1和慢指针2分别从起点和相遇点出发,他们总会在环的入口相遇,这样就找到了环的入口。

5.慢指针被快指针追上的时候,为什么一定是在慢指针走第一圈的时候?

假设快指针已经走了3圈,把环铺开,如下图,慢指针没转完一圈,一定就被快指针追上了。

以下是我ac的代码,做的多余判断太多了,建议去看一下网站上的代码。

class Solution {
public:ListNode *detectCycle(ListNode *head) {//判断是否有环//记得考虑一下只有一个节点的情况和没有节点的情况ListNode* slow = head, *fast = head;if(head == nullptr || head->next == NULL) return NULL;while(fast != nullptr && fast->next != NULL){slow = slow -> next;fast = fast -> next -> next;if(slow == fast) break;}if(fast == nullptr|| fast->next == NULL) return NULL;//如果有环,返回入环的第一个节点ListNode *cur = head;while(cur != slow){slow = slow -> next;cur = cur -> next;}return cur;}
};

以下是我第一次写的报错的代码,刚开始就让快指针走了两步,导致表达式发生变化,所以报错,代码一定要严格按照表达式来。

class Solution {
public:ListNode *detectCycle(ListNode *head) {//判断是否有环//特殊判断一下只有一个节点的情况和没有节点的情况if(head == NULL && head -> next == NULL) return NULL;ListNode* slow = head, *fast = head -> next -> next;while(fast != nullptr && slow != fast){slow = slow -> next;fast = fast -> next -> next;}if(fast == nullptr) return NULL;//如果有环,返回入环的第一个节点ListNode *cur = head;while(cur != slow){slow = slow -> next;cur = cur -> next;}return cur;}
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/497197.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

(南京观海微电子)——GH7009开机黑屏案例分析

一、 现象描述&#xff1a; 不良现象: LVDS模组&#xff0c;开机大概2秒后就黑屏。 二、问题分析 等主机进入Kernel 后做以下测试&#xff1a; 1、手动reset LCM 后 可以显示正常&#xff1b; 总结&#xff1a; 1&#xff09;uboot 部分HS 太窄&#xff0c;仅有4个clk宽度&am…

PaddleOCR文字识别模型的FineTune

一、paddleOCR paddle框架为百度开发的深度学习框架&#xff0c;其中对于文字检测、识别具有较为便利的开发条件。同时PaddleOCR文字识别工具较为轻量化&#xff0c;并可按照任务需求进行model的finetune&#xff0c;满足实际的业务需求。 源码来源&#xff1a;githubOCR 在gi…

Spark生态圈

Spark 主要用于替代Hadoop中的 MapReduce 计算模型。存储依然可以使用 HDFS&#xff0c;但是中间结果可以存放在内存中&#xff1b;调度可以使用 Spark 内置的&#xff0c;也可以使用更成熟的调度系统 YARN 等。 Spark有完善的生态圈&#xff1a; Spark Core&#xff1a;实现了…

影刀进阶指令 | Kimi (对标ChatGPT)

文章目录 影刀进阶指令 | Kimi &#xff08;对标ChatGPT&#xff09;一. 需求二. 流程三. 实现3.1 流程概览3.2 流程步骤讲解1\. 确定问题2\. 填写问题并发送3\. 检测答案是否出完 四. 运维 影刀进阶指令 | Kimi &#xff08;对标ChatGPT&#xff09; 简单讲讲RPA调用kimi实现…

Spring Security3.0.2版本

前言&#xff1a; 通过实践而发现真理&#xff0c;又通过实践而证实真理和发展真理。从感性认识而能动地发展到理性认识&#xff0c;又从理性认识而能动地指导革命实践&#xff0c;改造主观世界和客观世界。实践、认识、再实践、再认识&#xff0c;这种形式&#xff0c;循环往…

--spring.profiles.active=prod

rootproduct-qualification:~# ps -ef | grep java root 5110 1 3 16:57 ? 00:00:54 java -jar productQualification.jar --spring.profiles.activeprod root 6476 5797 0 17:26 pts/0 00:00:00 grep --colorauto java好的&#xff0c;你使用 ps …

力扣矩阵-算法模版总结

lc-73.矩阵置零-(时隔14天)-12.27 思路&#xff1a;(23min22s) 1.直接遍历遇0将行列设0肯定不行&#xff0c;会影响后续判断&#xff0c;题目又要求原地算法&#xff0c;那么进一步考虑是否可以将元素为0&#xff0c;其行列需要设为0的位置给存储下来&#xff0c;最后再遍历根据…

Markov test笔记

补充知识 来源于数学之美第五章&#xff1a; 到了 19 世纪&#xff0c;概率论的发展从相对静止的随机变量的研究发展到随机变量的时间序列 ( s 1 , s 2 , s 3 , … ) (s_1, s_2, s_3, \dots) (s1​,s2​,s3​,…)&#xff0c;即随机过程&#xff08;动态的&#xff09;。这在…

DeepSpeed 使用 LoRA 训练后文件结构详解

DeepSpeed 使用 LoRA 训练后文件结构详解 在大语言模型&#xff08;LLM&#xff09;的训练过程中&#xff0c;DeepSpeed 提供了强大的分布式训练能力&#xff0c;而 LoRA&#xff08;Low-Rank Adaptation&#xff09;通过参数高效微调技术显著减少了资源占用。完成训练后&…

GitHub 桌面版配置 |可视化界面进行上传到远程仓库 | gitLab 配置【把密码存在本地服务器】

&#x1f947; 版权: 本文由【墨理学AI】原创首发、各位读者大大、敬请查阅、感谢三连 &#x1f389; 声明: 作为全网 AI 领域 干货最多的博主之一&#xff0c;❤️ 不负光阴不负卿 ❤️ 文章目录 桌面版安装包下载clone 仓库操作如下GitLab 配置不再重复输入账户和密码的两个方…

docker-开源nocodb,使用已有数据库

使用已有数据库 创建本地数据库 数据库&#xff1a;nocodb 用户&#xff1a;nocodb 密码&#xff1a;xxxxxx修改docker-compose.yml 默认网关的 IP 地址是 172.17.0.1&#xff08;适用于 bridge 网络模式&#xff09;version: "2.1" services:nocodb:environment:…

uniapp 前端解决精度丢失的问题 (后端返回分布式id)

原因&#xff1a; 后端使用分布式id, id为19位数&#xff0c;导致精度丢失 &#xff0c;前端解决方法 这个是通过浏览器请求回来的数据&#xff0c;这个时候id 数据已经丢失了&#xff0c;在数据库查询不到&#xff0c;在调获详情接口的时候会有问题 实际的&#xff1a; 解决…

SQL-leetcode-180. 连续出现的数字

180. 连续出现的数字 表&#xff1a;Logs -------------------- | Column Name | Type | -------------------- | id | int | | num | varchar | -------------------- 在 SQL 中&#xff0c;id 是该表的主键。 id 是一个自增列。 找出所有至少连续出现三次的数字。 返回的…

【教程】通过Docker运行AnythingLLM

转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你&#xff0c;欢迎[点赞、收藏、关注]哦~ 官方教程&#xff1a;Local Docker Installation ~ AnythingLLM 1、先创建一个目录用于保存anythingllm的持久化文件&#xff1a; sudo mkdir /app su…

soular使用教程

用 soular 配置你的组织&#xff0c;工作更高效&#xff01;以下是快速上手的简单步骤&#xff1a; &#xfeff; 1. 账号管理 可以对账号信息进行多方面管理&#xff0c;包括分配不同的部门、用户组等&#xff0c;从而确保账号权限和职责的清晰分配。 &#xfeff; 1.1 用…

Github - 如何提交一个带有“verified”标识的commit

Github - 如何提交一个带有“verified”标识的commit 前言(Why) 今天在Github上浏览某项目的commit记录的时候发现&#xff0c;有的commit记录带有verified绿色标识&#xff0c;有的带有橘色的Unverified标识&#xff0c;还有的什么都不显示。 既然我是根正苗红的作者(bushi)…

基于Bregman的交替方向乘子法

目录标题 ADMM方法简介Bregman散度Bregman ADMM的原理主要优势代码示例&#xff1a;各个符号的解释&#xff1a;**梯度的几何含义**&#xff1a;具体数学公式&#xff1a;**应用示例**&#xff1a;**ADMM的标准形式&#xff1a;****ADMM中的变量角色&#xff1a;****ADMM中的更…

【操作系统】课程 3进程同步与通信 同步测练 章节测验

3.1知识点导图 无 3.2进程同步与互斥 【本章学习目标】 &#xff08;1&#xff09;了解进程通信的机制和通信方式。 &#xff08;2&#xff09;理解多道程序环境下进程间通信的机制&#xff1b;消息传递系统的实现。 &#xff08;3&#xff09;掌握临界资源和临界区的概念…

React中最优雅的异步请求

给大家分享在React19中使用useSuspense处理异步请求为什么是被认为最优雅的解决方案 一. 传统方案 解决异步请求的方案中&#xff0c;我们要处理至少两个最基本的逻辑 正常的数据显示数据加载的UI状态 例如&#xff1a; export default function Index(){const [content, …

《机器视觉:开启智能新时代》

《机器视觉&#xff1a;开启智能新时代》 一、机器视觉&#xff1a;工业之眼的崛起二、核心组件&#xff1a;构建精准视觉系统&#xff08;一&#xff09;光源&#xff1a;照亮视界的画笔&#xff08;二&#xff09;镜头&#xff1a;聚焦精准的慧眼&#xff08;三&#xff09;相…