LeetCode 1527, 54,114

目录

  • 1527. 患某种疾病的患者
    • 题目链接
    • 要求
    • 知识点
    • 思路
    • 代码
  • 54. 螺旋矩阵
    • 题目链接
    • 标签
    • 思路
    • 代码
  • 114. 二叉树展开为链表
    • 题目链接
    • 标签
    • 前序遍历
      • 思路
      • 代码
    • 前驱
      • 思路
      • 代码

1527. 患某种疾病的患者

题目链接

1527. 患某种疾病的患者

  • Patients的字段为patient_idpatient_nameconditions

要求

查询患有 I 类糖尿病的患者 ID (patient_id)、患者姓名(patient_name)以及其患有的所有疾病代码(conditions)。I 类糖尿病的代码总是包含前缀 DIAB1

任意顺序 返回结果表。

知识点

  1. like:对字符串做限制,通常与%搭配使用,%表示不限字符,并且不限字符的个数。例如select * from Users where name like '张%',假设Users表中有name张三丰、张四、老张、李四的数据,那么这条语句返回的是name张三丰、张四的数据。

思路

由于 I 类糖尿病的代码总是包含前缀 DIAB1,并且 ‘conditions’ (疾病)包含 0 个或以上的疾病代码,以 空格 分隔,所以在查询时要将conditions限制到DIAB1%conditions第一个单词的前缀为DIAB1)或% DIAB1%DIAB1不是conditions的第一个单词,但有一个其他单词的前缀为DIAB1)中。

代码

select
    patient_id,
    patient_name,
    conditions
from
    Patients
where
    conditions like 'DIAB1%'
or
    conditions like '% DIAB1%'

54. 螺旋矩阵

题目链接

54. 螺旋矩阵

标签

数组 矩阵 模拟

思路

按照顺时针螺旋顺序遍历矩阵很像深度优先搜索,都是以一个方向走到头,然后再探测别的方向。所以本题可以采用深度优先搜索的思想来解决。

先做好预备工作:使用一个boolean[][] vis来存储各个元素是否被遍历过,并且使用一个int[][] dir = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}}来作方向数组,这个方向数组的方向依次为向右、向下、向左、向上,也就是题目中的顺时针螺旋顺序,如果不是这个顺序,则会出问题。

然后再进行遍历:本题的搜索需要在传入 矩阵 和 当前元素的坐标 外,传入当前遍历的方向,然后 标记遍历过当前元素 并 将其放入结果链表,接着依次按照向右、向下、向左、向上的方向进行深搜,搜索的前提是下一个元素在矩阵中(对下一个元素的索引做检查),并且下一个元素没有遍历过(对下一个元素的vis做检查)。当搜索到最后一个元素时,它无论向哪个方向都无法再进行搜索(因为此时vis中所有元素都是true,也就是说所有元素已经被遍历过了),所有的递归就此终结。

最后返回结果链表即可。

代码

class Solution {
    public List<Integer> spiralOrder(int[][] matrix) {
        if (matrix == null || matrix.length == 0 || matrix[0].length == 0) { // 如果矩阵为空
            return new ArrayList<>(); // 则返回空集合
        }

        int row = matrix.length, col = matrix[0].length;
        res = new ArrayList<>(row * col); // 初始化结果链表大小为row * col,避免链表扩容影响性能
        vis = new boolean[row][col]; // 初始化判断数组
        dfs(matrix, 0, 0, 0); // 从0行0列开始向右遍历
        return res;
    }
    // 从r行c列开始 沿d方向 遍历
    private void dfs(int[][] matrix, int r, int c, int d) {
        vis[r][c] = true; // 记录遍历过本元素
        res.add(matrix[r][c]); // 将当前元素加入结果链表
        for (int k = 0; k < 4; k++) { // 分别向4个方向探测
            int kd = (d + k) % 4; // 获取方向数组的索引
            int kr = r + dir[kd][0], kc = c + dir[kd][1]; // 获取 沿kd方向前进的 下一个元素的 索引
            if (!(kr >= 0 && kr < matrix.length
                    && kc >= 0 && kc < matrix[0].length) // 如果这个元素不在矩阵中
                    || vis[kr][kc]) { // 或者这个元素被遍历过了
                continue; // 则跳过这个元素
            }
            dfs(matrix, kr, kc, kd); // 从这个元素开始 沿kd方向 遍历
        }
    }
    private List<Integer> res; // 结果链表
    private boolean[][] vis; // 判断某个元素是否已经被遍历过了
    private int[][] dir = {{0, 1}, {1, 0}, {0, -1}, {-1, 0}}; // 方向数组,分别为向右、向下、向左、向上
}

114. 二叉树展开为链表

题目链接

114. 二叉树展开为链表

标签

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

前序遍历

思路

本题的简单思路十分简单,使用前序遍历将二叉树中所有的节点存入链表,然后再将链表中的所有节点按顺序调整指向:让前一个节点的左指针指向null,右指针指向当前节点,从而形成链表的结构。

代码

class Solution {
    public void flatten(TreeNode root) {
        if (root == null) {
            return;
        }
        List<TreeNode> list = new ArrayList<>();
        preOrder(root, list);
        for (int i = 1; i < list.size(); i++) {
            TreeNode prev = list.get(i - 1); // 获取前一个节点
            TreeNode curr = list.get(i); // 获取当前节点
            prev.left = null; // 让前一个节点的左子节点指向null
            prev.right = curr; // 将当前节点 放到 前一个节点的右子节点处
        }
    }
    // 前序遍历二叉树,将节点按照前序保存到list中
    private void preOrder(TreeNode curr, List<TreeNode> list) {
        if (curr == null) {
            return;
        }
        list.add(curr);
        preOrder(curr.left, list);
        preOrder(curr.right, list);
    }
}

前驱

思路

什么叫做前驱节点?前驱节点指的是以中序遍历遍历二叉树时,某一个节点的前一个节点(前驱节点是当前节点左子树中的一路往右子节点遍历最终节点)。在二叉搜索树,前驱节点是小于当前节点值的最大节点。

为什么要讲前驱节点?因为对于一个节点来说,前序遍历总是先处理当前值,然后再遍历左子节点,最后是右子节点。从而在前序遍历中,前驱节点的下一个节点就是当前节点的右子节点

所以只需要在当前节点有左子节点时,将左子节点前驱节点这段二叉树插入到当前节点右子节点之间,然后更新当前节点为插入之后的右子节点即可。对于没有左子节点的节点,无需理会,直接更新当前节点为下一个右子节点。

例如对于以下二叉树:
二叉树1
先寻找节点1的前驱节点,发现其前驱节点为节点4,将节点4与节点5建立连接,并将节点2放到节点5原本的位置上,然后当前节点更新到节点2,如下图所示:
二叉树2
接着寻找节点2的前驱节点,发现其前驱节点为节点3,将节点3与节点4建立联系,并将节点3放到节点4原本的位置上,接着就不存在有左子节点的节点了,如下图所示:
二叉树3

代码

class Solution {
    public void flatten(TreeNode root) {
        TreeNode curr = root;
        while (curr != null) {
            if (curr.left != null) { // 如果左子节点不为空,则进行操作
                TreeNode next = curr.left; // 先保存左子节点
                TreeNode predecessor = predecessor(curr); // 获取当前节点的前驱节点
                predecessor.right = curr.right; // 让前驱节点的右指针 指向 当前节点的右子节点
                curr.left = null; // 让当前节点的左指针 指向 null
                curr.right = next; // 让当前节点的右指针 指向 左子节点
            }
            curr = curr.right; // 更新当前节点
        }
    }
    // 寻找curr的前驱节点
    private TreeNode predecessor(TreeNode curr) {
        TreeNode pre = curr.left; // 先获取当前节点的左子节点
        while (pre.right != null) {
            pre = pre.right; // 一路往右子节点方向遍历
        }
        return pre; // 找到最终节点
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

等保测评练习16

等级保护初级测评师试题16 姓名&#xff1a; 成绩&#xff1a; 一、判断题&#xff08;10110分&#xff09; 1.虚拟机被非法利用后&#xff0c;可能被当作跳板机。&#xff08;T&#xff09; P312 2.云服务商&#xff0c;为云计算服务…

初识 Redis

基础知识网上很多&#xff0c;就不写的太啰嗦&#xff0c;这里纪录一下我的首次使用。 一、redis 安装 在服务器上安装 redis 我的服务器环境是宝塔&#xff0c;方便安装 php 扩展打开 redis 二、项目中的实际应用 首先说明&#xff0c;项目环境是 php redis 的一些基本操…

TypeScript学习笔记(全)

文章目录 TypeScript入门2.编译并运行TS代码2.1.简化运行ts步骤 3.TS中的常用类型3.1.TS中的类型注解3.2.TS中的原始类型3.3.TS中的数组类型3.4.TS中的联合类型3.5.类型别名3.6.函数类型3.6.1.单独执行参数、返回值类型3.6.2.同时指定参数&#xff0c;返回值类型3.6.3.函数的vo…

昇思25天学习打卡营第4天|扩散模型

文章目录 昇思MindSpore应用实践基于MindSpore的Diffusion扩散模型1、Diffusion Models 简介2、构建 Diffusion Model 的准备工作3、Attention 机制4、条件 U-Net5、Diffusion 正向过程6、Diffusion 反向过程7、Diffusion 模型训练 Reference 昇思MindSpore应用实践 本系列文章…

掌握Python编程的深层技能

一、Python基础语法、变量、列表、字典等运用 1.运行python程序的两种方式 1.交互式即时得到程序的运行结果 2.脚本方式把程序写到文件里(约定俗称文件名后缀为.py),然后用python解释器解释执行其中的内容2.python程序运行的三个步骤 python3.8 C:\a\b\c.py 1.先启动python3…

什么是产线工控安全,如何保障产线设备的安全

什么是产线工控安全&#xff1f; 工控&#xff0c;指的是工业自动化控制&#xff0c;主要利用电子电气、机械、软件组合实现。即是工业控制系统&#xff0c;或者是工厂自动化控制。产线工控安全指的是工业控制系统的数据、网络和系统安全。随着工业信息化的迅猛发展&#xff0…

【Lua】第一篇:在Linux系统中安装搭建lua5.4.1环境

文章目录 一. 远程下载安装包二. 解压安装包三. 编译安装Lua环境 一. 远程下载安装包 输入以下命令即可在当前目录下&#xff0c;远程下载安装包lua-5.4.1.tar.gz&#xff1a; wget http://www.lua.org/ftp/lua-5.4.1.tar.gzPS&#xff1a;其他版本的安装包如下&#xff0c;可…

鸿蒙项目实战-月木学途:1.编写首页,包括搜索栏、轮播图、宫格

效果展示 搜索栏制作 相关知识回顾 输入框组件TextInput 单行输入框类型.type(InputType.Normal)//基本输入框.type(InputType.Password)//密码.type(InputType.Email)//邮箱.type(InputType.Number)//数字.type(InputType.PhoneNumber)//电话号.type(InputType.Normal).type…

【折腾手机】一加6T刷机postmarketOS经历和体验

写在前面 到目前为止&#xff0c;我已经花了非常多的时间去学习和了解x86架构和RISC-V架构&#xff0c;对它们的指令集编程、指令格式的设计、编译套件的使用都亲自去体会和实践过&#xff0c;学到了很多的东西。但是对于离我们最近的arm架构却了解甚少。为什么说离我们最近呢…

Python | Leetcode Python题解之第199题二叉树的右视图

题目&#xff1a; 题解&#xff1a; class Solution:def rightSideView(self, root: TreeNode) -> List[int]:rightmost_value_at_depth dict() # 深度为索引&#xff0c;存放节点的值max_depth -1stack [(root, 0)]while stack:node, depth stack.pop()if node is not…

15 个适用于企业的生成式 AI 用例

作者&#xff1a;来自 Elastic Jennifer Klinger 关于生成式人工智能及其能做什么&#xff08;和不能做什么&#xff09;有很多讨论。生成式人工智能&#xff08;例如大型语言模型 - LLMs&#xff09;利用从大量训练数据中学习到的模式和结构来创建原创内容&#xff0c;而无需存…

weiyang**2.部署

一、官方文档 一键部署可以在 同机 快速搭建WeBASE管理台环境&#xff0c;方便用户快速体验WeBASE管理平台。 一键部署会搭建&#xff1a;节点&#xff08;FISCO-BCOS 2.0&#xff09;、管理平台&#xff08;WeBASE-Web&#xff09;、节点管理子系统&#xff08;WeBASE-Node-…

3D生物打印的未来:多材料技术的突破

多材料生物打印技术是近年来发展迅速的一项技术&#xff0c;为组织工程和再生医学带来了新的机遇&#xff0c;可以帮助我们更好地理解人体组织的结构和功能&#xff0c;并开发新的治疗方法。 1. 组织构建 复杂性模拟&#xff1a;多材料生物打印技术能够构建具有层次结构和异质…

2022年第十三届蓝桥杯比赛Java B组 【全部真题答案解析-第二部分】

上一篇文章&#xff1a;2022年第十三届蓝桥杯比赛Java B组 【全部真题答案解析-第一部分】_尘封的CPU的博客-CSDN博客最近回顾了Java B组的试题&#xff0c;深有感触&#xff1a;脑子长时间不用会锈住&#xff0c;很可怕。兄弟们&#xff0c;都给我从被窝里爬起来&#xff0c;赶…

综合项目实战--jenkins节点模式

一、DevOps流程 DevOps是一种方法论,是一系列可以帮助开发者和运维人员在实现各自目标的前提下,向自己的客户或用户交付最大化价值及最高质量成果的基本原则和实践,能让开发、测试、运维效率协同工作的方法。 DevOps流程(自动化测试部分) DevOps完整流程 二、gitee+j…

Burpsuite靶场中信息泄露相关的实验通关

目录 第一关&#xff1a;错误消息中的信息披露 第二关&#xff1a;调试页面信息披露 第三关&#xff1a;通过备份文件披露源代码 第四关&#xff1a;通过信息披露绕过身份验证 第五关&#xff1a;版本控制历史中的信息披露 最近看大佬的文章&#xff0c;发现了很对自己没有…

IOS Swift 从入门到精通:ios 连接数据库 安装 Firebase 和 Firestore

创建 Firebase 项目 导航到Firebase 控制台并创建一个新项目。为项目指定任意名称。 在这里插入图片描述 下一步,启用 Google Analytics,因为我们稍后会用到它来发送推送通知。 在这里插入图片描述 在下一个屏幕上,选择您的 Google Analytics 帐户(如果已创建)。如果没…

FFT的IP核使用报错的检查流程

一、config部分 拉出clk resetn, s_axis_config_tdata&#xff0c; s_axis_config_tready, s_axis_config_tvalid .这四个信号。 时序行为解释&#xff1a;

【python - 数据】

一、序列 序列&#xff08;sequence&#xff09;是一组有顺序的值的集合&#xff0c;是计算机科学中的一个强大且基本的抽象概念。序列并不是特定内置类型或抽象数据表示的实例&#xff0c;而是一个包含不同类型数据间共享行为的集合。也就是说&#xff0c;序列有很多种类&…

第0章_项目方案介绍

文章目录 第0章 项目方案介绍0.1 功能介绍0.2 硬件方案0.3 软件方案0.3.1 上位机方案0.3.2 **中控方案**0.3.3 **传感器方案**0.3.4 **技术难点** 第0章 项目方案介绍 0.1 功能介绍 本课程来自一个真实项目&#xff1a;多个气体传感器的管理。由于气体传感器比较昂贵&#xf…