LeetCode 71, 86, 117

文章目录

  • 71. 简化路径
    • 题目链接
    • 标签
    • 思路
    • 代码
  • 86. 分隔链表
    • 题目链接
    • 标签
    • 思路
      • 分隔链表
      • 构建多个链表
      • 合并链表
    • 代码
  • 117. 填充每个节点的下一个右侧节点指针 II
    • 题目链接
    • 标签
    • 法一:层序遍历
      • 思路
      • 代码
    • 法二:链表
      • 思路
      • 代码

71. 简化路径

题目链接

71. 简化路径

标签

栈 字符串

思路

本题使用了 双端队列

  • 在存储目录名时,将其当作 从队列的同一端进出)。
    • 遇到 ".." 时,退一级目录,即移出队列 头部 的元素,对应着 弹出栈顶元素
    • 遇到不为 "." 的非空目录时,进一级目录,即将目录名加入队列 头部,对应着 将元素压入栈顶
  • 在取出目录名时,将其当作 队列从队列的一端进,另一端出)。
    • 由于目录名是从队列 头部 加入的,所以从队列 尾部 取出它。

代码

class Solution {public String simplifyPath(String path) {String[] dirs = path.split("/"); // 用 "/" 将所有目录隔离开来LinkedList<String> deque = new LinkedList<>(); // 储存 目录名 的双端队列for (String dir : dirs) { // 取出每个目录名进行操作if ("..".equals(dir)) { // 如果目录名为 ".."deque.pollFirst(); // 则退一级目录,即移除队列头元素 ( 弹出栈顶元素 )} else if (!dir.isBlank() && !".".equals(dir)) { // 如果目录名不为空,并且不是 "."deque.offerFirst(dir); // 则进一级目录,即将目录名加入队列头部 ( 将元素压入栈顶 )}}if (deque.isEmpty()) { // 如果双端队列为空return "/"; // 则直接返回 "/"}StringBuilder builder = new StringBuilder(); // 用于构建结果路径的字符串拼接器while (!deque.isEmpty()) { // 直到双端队列为空// 将 "/" 和 目录名拼接到路径中,注意此时得从队列尾部开始倒序遍历builder.append('/').append(deque.pollLast());}return builder.toString();}
}

86. 分隔链表

题目链接

86. 分隔链表

标签

链表 双指针

思路

分隔链表

本题要求分隔链表,使得 小于 x 的节点都出现在 大于或等于 x 的节点之前。可以这样思考:分隔链表就是先根据条件构建多个链表,然后再将其合并起来

构建多个链表

在本题中,可以构建两个链表,第一个链表保存原始链表中所有 小于 x 的节点,第二个链表保存原始链表中所有 大于或等于 x 的节点(即第二个链表保存剩余节点),这样就可以按照题目要求将链表分隔开来。

构建链表有两种方法:

  1. 使用 头节点 + 当前节点 这个组合。
    • 在添加节点时比较麻烦,得判断待添加节点是否是第一个节点,如果是,则需要给头节点赋值。
    • 在获取头节点时简单,直接返回头节点即可。
  2. 使用 哨兵节点 + 当前节点 这个组合。(当前节点的初始值为哨兵节点)
    • 在添加节点时简单,无需判断待添加节点是否是第一个节点,直接让当前节点指向待添加节点。
    • 在获取头节点时比较麻烦,需要使用 哨兵节点.next

我个人比较推荐第二种方法,在本题中,就使用到了第二种方法。

合并链表

构建完链表后,当前节点就是所构建的链表的尾节点;头节点可以通过 哨兵节点.next 来获取。

合并链表分为以下两步:

  1. 让 大于或等于 x 的节点形成的链表 的尾节点指向 null
  2. 让 小于 x 的节点形成的链表的 尾节点 指向 大于或等于 x 的节点形成的链表的 头节点,形成新链表。

解释一下为什么需要第一步:将链表构建完毕之后,链表的尾节点可能取自 原先链表的尾节点之外的节点。例如对于链表 1->2->3->4->1,如果 x = 3,则最终大于或等于 x 的节点形成的链表 3->4 的尾节点是节点 4,它指向节点 1。所以需要让尾节点指向 null 这步操作。

代码

class Solution {public ListNode partition(ListNode head, int x) {ListNode smallS = new ListNode(0); // 小于 x 的节点形成的链表 的哨兵节点ListNode small = smallS; // 小于 x 的节点形成的链表 的当前节点,最后成为尾节点ListNode largeS = new ListNode(0); // 大于或等于 x 的节点形成的链表 的哨兵节点ListNode large = largeS; // 大于或等于 x 的节点形成的链表 的当前节点,最后成为尾节点// 构建链表while (head != null) { // 在原链表上遍历if (head.val < x) { // 如果当前节点小于 xsmall.next = head; // 则将其加入 小于 x 的节点形成的链表small = small.next; // 并 更新 当前节点} else { // 否则当前节点大于或等于 xlarge.next = head; // 则将其加入 大于或等于 x 的节点形成的链表large = large.next; // 并 更新 当前节点}head = head.next; // 更新指向原链表的指针}// 合并链表large.next = null; // 防止 大于或等于 x 的节点形成的链表 的尾节点指向其他节点,让其指向 null// 让 小于 x 的节点形成的链表的尾节点 指向 大于或等于 x 的节点形成的链表的头节点,形成新链表small.next = largeS.next;return smallS.next; // 返回新链表的头节点}
}

117. 填充每个节点的下一个右侧节点指针 II

题目链接

117. 填充每个节点的下一个右侧节点指针 II

标签

树 深度优先搜索 广度优先搜索 链表 二叉树

法一:层序遍历

思路

要将每层节点像链表一样连接起来,说明需要按层遍历二叉树,所以本题考查了 二叉树的层序遍历,而且是 一层一层地遍历,层序遍历使用 广度优先搜索,广度优先搜索使用 队列,处理如下:

  1. 先处理二叉树的第一层,将根节点放入队列。
  2. 遍历队列,每次遍历一层节点,直到队列没有节点为止。对这一层节点的遍历的操作如下:
    • 从队列中取出当前节点。
    • 对当前节点进行操作。
    • 如果当前节点的左子节点不为 null,则将其加入队列,等待下一层遍历。
    • 如果当前节点的右子节点不为 null,则将其加入队列,等待下一层遍历。

除了第二步的第二个操作与题有关之外,其他操作均与题目无关,都是模版。

代码

class Solution {public Node connect(Node root) {if (root == null) { // 如果根节点为 nullreturn null; // 则直接返回 null}LinkedList<Node> queue = new LinkedList<>(); // 存储二叉树每层的节点queue.offer(root); // 先处理二叉树的第一层,将根节点放到队列中while (!queue.isEmpty()) { // 直到队列中没有节点int size = queue.size(); // 获取本层元素的个数Node prev = null; // 当前节点的上一个节点for (int i = 0; i < size; i++) { // 一层一层地遍历Node curr = queue.poll(); // 取出当前节点// 对当前节点进行操作if (i != 0) { // 当 curr 不是第一个节点时prev.next = curr; // 让 prev 指向 curr}prev = curr; // 更新 prev 的值if (curr.left != null) { // 如果当前节点的左子节点不为 nullqueue.offer(curr.left); // 则将其加入队列,等待下一层遍历}if (curr.right != null) { // 如果当前节点的右子节点不为 nullqueue.offer(curr.right); // 则将其加入队列,等待下一层遍历}}}return root;}
}

法二:链表

思路

层序遍历时使用了 队列,它会占用一定的内存,而我们可以使用一种占用内存更少的思路:构建本层的链表可以使用上一层构建好的链表,或者说 从根节点这第一层节点开始,在遍历本层节点时,就可以构建下一层节点形成的链表

构建链表使用到了 prev 指针,它代表前一个节点。每次在下一层找到新的节点时,让 prev 指向新节点,并更新 prev 的值。此时需要使用 sentinel 哨兵节点,作为 prev 的初始值,从而避免对 每层的头节点 进行特殊处理。

实际上这种解决方案还挺简单的,理解思路之后看代码即可。

代码

class Solution {public Node connect(Node root) {if (root == null) { // 如果根节点为 nullreturn null; // 则直接返回 null}Node head = root; // 当前层的头节点,第一层的头节点是 rootwhile (head != null) {Node sentinel = new Node(0); // 下一层节点的哨兵节点,指向下一层构建的链表的头节点Node prev = sentinel; // 下一层链表中的前一个节点Node curr = head; // 从 head 开始遍历本层节点while (curr != null) {if (curr.left != null) { // 如果左子节点不为 nullprev.next = curr.left; // 则让 prev 指向 左子节点prev = prev.next; // 并更新 prev}if (curr.right != null) { // 如果右子节点不为 nullprev.next = curr.right; // 则让 prev 指向 右子节点prev = prev.next; // 并更新 prev}curr = curr.next; // 更新 curr}head = sentinel.next; // 更新 head 到下一层链表的头节点}return root;}
}

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

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

相关文章

写一个简单的兼容GET/POST请求的登录接口

本文目录 安装JDK17安装或者更新Intelij Idea 2024SpringBoot生成项目压缩包下载maven&#xff0c;idea添加maven写POST接口浏览器访问GET接口PostMan安装及访问POST接口 安装JDK17 参考&#xff1a;https://blog.csdn.net/tiehou/article/details/129575138 安装或者更新Int…

类与对象-多态-案例3-电脑组装具体实现

#include<iostream> #include<string> using namespace std; //CPU class CPU { public:virtual void calculate() 0; }; //显卡 class GraCard { public:virtual void graphics() 0; }; //存储 class Memory { public:virtual void memory() 0; }; class Compu…

【CSS】基本用法

一、CSS简介 层叠样式表&#xff08;CSS&#xff09;是一种用来表现HTML或XML文档样式的计算机语言&#xff0c;可以对网页中元素位置进行像素级精确控制。CSS的中文名称为层叠样式表&#xff0c;外文全称为Cascading Style Sheets&#xff0c;是计算机科学领域的一种技术。CS…

大学生跨保计算机--学习规划分享

写在前面 目标 绩点达到前三&#xff0c;修计算机双学位丰富简历&#xff0c;积极参与科研竞赛&#xff0c;提前为保研铺路 暑假 一个月时间&#xff0c;自学Python语言的基础语法&#xff0c;去B站找视频&#xff0c;为以后参加比赛打下一定的基础 开学后可能没有太多时间…

C语言函数:编程世界的魔法钥匙(2)-学习笔记

引言 注&#xff1a;由于这部分内容比较抽象&#xff0c;而小编我又是一个刚刚进入编程世界的计算机小白&#xff0c;所以我的介绍可能会有点让人啼笑皆非。希望大家多多包涵&#xff01;万分感谢&#xff01;待到小编我学有所成&#xff0c;一定会把这块知识点重新介绍一遍&a…

[Day 32] 區塊鏈與人工智能的聯動應用:理論、技術與實踐

AI中的神經網絡技術 神經網絡&#xff08;Neural Networks&#xff09;是人工智能&#xff08;AI&#xff09;領域的一個重要分支&#xff0c;靈感來自於生物神經系統。本文將深入探討神經網絡的基本概念、結構、工作原理及其在AI中的應用&#xff0c;並通過Python代碼詳細解釋…

HarmonyOS Web组件(二)

1. HarmonyOS Web组件 官方文档 1.1. 混合开发的背景和好处 混合开发&#xff08;Hybrid Development&#xff09;是一种结合原生应用和Web应用的开发模式&#xff0c;旨在同时利用两者的优势。随着移动应用需求的多样化和复杂化&#xff0c;单一的开发方式往往难以满足所有…

sass版本更新,不推荐使用嵌套规则后的声明

目前在 Sass 中不推荐使用嵌套规则后的声明&#xff0c;在 为了通知用户即将进行的更改&#xff0c;并给他们时间进行更改 与之兼容的样式表。在未来的版本中&#xff0c;Dart Sass 将更改为 匹配纯 CSS 嵌套生成的顺序。Deprecation Warning: Sasss behavior for declarations…

对androidTestDebug 产物进行重新签名

在 Gradle 中&#xff0c;你可以通过以下步骤对子模块中的 androidTestDebug 产物进行重新签名操作&#xff1a; 1. 创建一个自定义的 Sign 任务 在主项目的 build.gradle 文件中&#xff0c;创建一个自定义任务来执行重新签名操作&#xff1a; task reSignAndroidTestDebug…

Pytorch学习笔记【B站:小土堆】

文章目录 1 基础环境配置&#xff08;CPU版&#xff09;2 PyTorch学习2.1 Dataset和DataLoader2.1.1 Dataset2.1.2 DataLoader 2.2 Tensorboardadd_scalaradd_imageadd_graph 2.3 Transforms2.3.1 ToTensor2.3.2 Normalize2.3.3 Resize2.3.4 Compose 2.4 torchvision中的数据集…

pnpm build打包时占内溢出

这两天在打包H5网页的时候失败&#xff0c;总是提示下方错误 FATAL ERROR: Ineffective mark-compacts near heap limit Allocation failed - JavaScript heap out of memory 严重错误&#xff1a;堆限制附近标记压缩无效分配失败 - JavaScript 堆内存不足 尝试了多种方法&…

Linux源码安装的Redis如何配置systemd管理并设置开机启动

文章目录 实验前提实验 实验前提 已完成源码安装并能正常启动redis /usr/local/bin/redis-server能正常启动redis 实验 vim /etc/systemd/system/redis.service内容如下&#xff1a; [unit] Descriptionredis-server Afternetwork.target[Service] Typeforking ExecStart/…

【Blockly图形化积木编程二次开发学习笔记】5.自动保存与恢复

文章目录 引用使用 引用 <script src"./blockly/appengine/storage.js"></script>使用 <script>window.setTimeout(BlocklyStorage.restoreBlocks, 0); // 从本地存储中恢复块BlocklyStorage.backupOnUnload(); // 用户离开页面时自动将块备份到…

基于radix4的booth乘法器设计

下述乘法器是基于radix 4的booth乘法器&#xff0c;常用于集成电路IC的乘法器设计。 支持位宽可设置支持signsign、signunsign、unsignsign、unsignunsign; // FHDR------------------------------------------------------------ …

降雨量预测 | Matlab基于ARIMA-RBF降雨量预测

目录 效果一览基本介绍程序设计参考资料 效果一览 基本介绍 降雨量预测 | Matlab基于ARIMA-RBF降雨量预测 注&#xff1a;程序和数据放在一个文件夹。 程序语言为matlab&#xff0c;程序可出预测效果图&#xff0c;指标图; 代码特点&#xff1a;参数化编程、参数可方便更改、代…

web前端学习笔记Day02

web学习Day02 一、页面布局 盒子模型 盒子将页面的所有标签都包含在了一个矩形区域content(内容区域)->padding(内边距区域)->border(边框区域)->margin(外边距区域) div标签: 一行只能显示一个&#xff08;独占一行&#xff09;width默认为父元素宽度&#xff0c…

Docker核心技术:Docker原理之Namespace

云原生学习路线导航页&#xff08;持续更新中&#xff09; 本文是 Docker核心技术 系列文章&#xff1a;Docker原理之Namespace&#xff0c;其他文章快捷链接如下&#xff1a; 应用架构演进容器技术要解决哪些问题Docker的基本使用Docker是如何实现的 Docker核心技术&#xff1…

多模态AI:概念、用例、优势、挑战及发展未来

多模态实际上是在尝试复制人类的感知方式&#xff1a;我们将视觉、声音和触觉等感官输入结合起来&#xff0c;形成对现实的更细致入微的感知&#xff0c;并利用这些数据来做出决定或采取行动。多模态模式也在尝试做同样的事情。 多模态AI的应用范围正在不断扩大&#xff0c;那么…

【Spring】深入理解了IOC(控制反转)和DI(依赖注入)

学习时间&#xff1a;09&#xff1a;XX--10&#xff1a;28&#xff0c;50min 微信读书 今日学习Spring框架&#xff0c;有很大的收获&#xff0c;感觉是学习SpringBoot以来的一个里程碑&#xff0c;因为今天上午这50min理解了Spring框架的核心基础&#xff0c;控制反转&#x…

使用 useLazyAsyncData 提升数据加载体验

title: 使用 useLazyAsyncData 提升数据加载体验 date: 2024/7/19 updated: 2024/7/19 author: cmdragon excerpt: 摘要&#xff1a;本文介绍useLazyAsyncData函数在Nuxt 3中的使用&#xff0c;以提升数据加载体验。此函数支持异步获取数据并在组件中处理挂起与错误状态&…