LeetCode 739, 82, 106

文章目录

  • 739. 每日温度
    • 题目链接
    • 标签
    • 思路
    • 代码
  • 82. 删除排序链表中的重复元素 II
    • 题目链接
    • 标签
    • 思路
    • 代码
  • 106. 从中序与后序遍历序列构造二叉树
    • 题目链接
    • 标签
    • 思路
      • 二叉树的三种遍历
      • 值与索引的映射
      • 对于后序遍历的使用
      • 对于中序遍历的使用
    • 代码

739. 每日温度

题目链接

739. 每日温度

标签

栈 数组 单调栈

思路

本题求解的是:对于第 i 天,下一个更高温度出现在几天后。抽象一下,就是 求 每个元素之后的更大元素的索引 与 当前元素索引 之差

可以使用 单调栈 的思想解决,维护一个 从栈顶到栈底 温度 单调递增 的栈,这个栈存储未找到等待天数的天的索引。

遍历温度数组,对于第 i 天的温度 temp,如果 栈中有索引 prevIndex(这个索引取自 栈顶,是整个栈中温度最小的天的索引) 并且 该索引指向的温度比 temp 小,则 第 prevIndex 天的下一个更高温度出现在 i - prevIndex 天之后,它找到了自己的等待天数,可以将其移出栈中。重复这步操作,直到 没有未找到等待天数的天(栈中有索引)prevIndex 天的温度比 temp

可以发现:在栈中,越靠近栈顶,索引指向的温度越低;越靠近栈底,索引指向的温度越高。这就是 单调栈,它能解决 求每个元素之后的更大元素 的问题,稍微变形就变成了本题。

代码

class Solution {public int[] dailyTemperatures(int[] temperatures) {int len = temperatures.length;int[] res = new int[len];LinkedList<Integer> stack = new LinkedList<>(); // 存储 未找到等待天数 的天的索引for (int i = 0; i < len; i++) {int temp = temperatures[i]; // 获取第 i 天的温度// 给 未找到等待天数 的每天 赋 等待天数 的值// 直到 没有未找到等待天数的天的索引 或 之前有一天温度更高while (!stack.isEmpty() && temp > temperatures[stack.peek()]) {int prevIndex = stack.pop(); // 取出 未找到等待天数 的天数res[prevIndex] = i - prevIndex; // 保存等待天数}stack.push(i); // 将 i 放到栈中,为它寻找更高温度}return res;}
}

82. 删除排序链表中的重复元素 II

题目链接

82. 删除排序链表中的重复元素 II

标签

链表 双指针

思路

本题是去除链表中重复的所有元素,本质上是 删除节点,删除一个节点就是 让前一个节点指向后一个节点,跳过这个节点。发现这里使用到了 前一个节点,所以使用 哨兵节点 指向链表,避免 对删除第一个节点 进行的特殊处理。

要删除多个重复节点,除了原有的 前一个节点的指针 prev这个节点的指针 curr 之外,还得使用一个指针 afterafter 指向不与 curr 重复的节点,最后得让 prev 指向 after,从而删除 从 prevafter 之间的多个重复节点。

如果没有遇到重复节点,就让 prev 正常向右移动,并更新 curr, after

代码

class Solution {public ListNode deleteDuplicates(ListNode head) {ListNode sentinel = new ListNode(0, head); // 哨兵节点,指向原始链表ListNode prev = sentinel; // 指向待检查节点,是它的前一个节点ListNode curr; // curr 是待检查节点ListNode after; // after 是待检查节点的下一个节点,它最终指向不与 curr 重复的节点// 给 curr, after 赋值,并在它两个中有一个为 null 时退出循环while ((curr = prev.next) != null && (after = curr.next) != null) {if (curr.val != after.val) { // 如果 after 不与 after 重复prev = prev.next; // 则让 prev 正常向右移动continue;}// 找到不与 curr 重复的节点,null 也算不与 curr 重复while ((after = after.next) != null && after.val == curr.val) {continue;}prev.next = after; // 让 prev 指向这个节点}return sentinel.next; // 返回哨兵节点指向的链表}
}

106. 从中序与后序遍历序列构造二叉树

题目链接

106. 从中序与后序遍历序列构造二叉树

标签

树 数组 哈希表 分治 二叉树

思路

本题和 105. 从前序与中序遍历序列构造二叉树 十分相似,不过本题考查的是 中序遍历后序遍历

二叉树的三种遍历

先讲一讲二叉树的三种 (深度优先搜索) 遍历:

  • 前序遍历:先处理本节点的值,再遍历左子树,最后遍历右子树。
  • 中序遍历:先遍历左子树,再处理本节点的值,最后遍历右子树。
  • 后序遍历:先遍历左子树,再遍历右子树,最后处理本节点的值。

例如对于下图:
二叉树
它的三种遍历结果分别如下:

  • 前序遍历[4, 2, 1, 3, 6, 5, 7]
    可以这样分:[4], [2, 1, 3], [6, 5, 7],分别为:本节点、左子树、右子树。
    左子树有三个节点的原因是:中序遍历的本节点 [4] 前有 3 个元素。
  • 中序遍历[1, 2, 3, 4, 5, 6, 7]
    可以这样分:[1, 2, 3], [4], [5, 6, 7],分别为:左子树、本节点、右子树。
    本节点为 [4] 的原因是:前序遍历的第一个元素是 4 后序遍历的最后一个元素是 4
  • 后序遍历[1, 3, 2, 5, 7, 6, 4]
    可以这样分:[1, 3, 2], [5, 7, 6], [4],分别为:左子树、右子树、本节点。
    左子树有三个节点的原因是:中序遍历的本节点 [4] 前有 3 个元素。

由此可见:只要有中序遍历,再加上前序遍历或后序遍历的其中一种,就可以构建一颗二叉树。

值与索引的映射

在构建二叉树时,获取后序遍历的某一个值作为根节点,然后要根据这个值将中序遍历的结果划分成两部分,为了方便划分,可以使用一个 Map 来存储中序遍历的 值 与 索引 的映射

对于后序遍历的使用

仔细观察后序遍历的结果 [1, 3, 2, 5, 7, 6, 4],可以发现一个很奇妙的东西:从后到前,4 是根节点,6 是右子树的根节点,7, 5 是右子树的两个子节点(也算是两个 null 的根节点),2 是左子树的根节点,3, 1 是左子树的两个子节点(也算是两个 null 的根节点)。

在使用递归的前提下,如果 先构建右子树,再构建左子树,最后返回本次构建的树,就可以把 倒序遍历 postorder 的结果 作为每棵树(或子树)的根节点

对于中序遍历的使用

在区间 [inLeft, inRight] 上构建二叉树时,先通过后序遍历找根节点的值 rootVal,然后通过 Map 寻找这个值在中序遍历中对应的索引 index,接着进行划分:在区间 [index + 1, inRight] 上构建右子树,在区间 [inLeft, index - 1] 上构建左子树。最后将本次在区间 [inLeft, inRight] 上构建的二叉树返回。

代码

class Solution {public TreeNode buildTree(int[] inorder, int[] postorder) {// 初始化成员变量this.inorder = inorder;this.postorder = postorder;this.postIndex = postorder.length - 1;for (int i = 0; i < inorder.length; i++) { // 构建中序遍历的 值 与 索引 的映射this.indcies.put(inorder[i], i);}return build(0, inorder.length - 1);}private int postIndex; // postorder 数组的索引,指向正在构建的树的根节点private int[] inorder; // 中序遍历数组private int[] postorder; // 后序遍历数组// 中序遍历的 值 与 索引 的映射,key 为 值,value 为 值在中序遍历数组中的索引private Map<Integer, Integer> indcies = new HashMap<>();// 在中序遍历数组的 [inLeft, inRight] 区间内,构建树private TreeNode build(int inLeft, int inRight) {if (inLeft > inRight) { // 如果区间内没有节点return null; // 则不需要建立二叉树,退出递归}int rootVal = postorder[postIndex]; // postIndex 指向 postorder 中当前树的根节点的值int index = indcies.get(rootVal); // 获取当前根节点的值在 中序遍历数组 中的索引TreeNode root = new TreeNode(rootVal); // 新建当前树的根节点// 先构建右子树,再构建左子树,最后返回本次构建的二叉树postIndex--; // 让 postIndex 指向右子树的根节点root.right = build(index + 1, inRight); // 构建完右子树后,postIndex 指向左子树的根节点root.left = build(inLeft, index - 1);return root;}
}

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

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

相关文章

jenkins 插件版本冲突

一、Jenkins安装git parameter 插件重启后报错与临时解决方案 cd /root/.jenkins cp config.xml config.xml.bak vim config.xml <authorizationStrategy class"hudson.security.FullControlOnceLoggedInAuthorizationStrategy"><denyAnonymousReadAcces…

【工具使用】EMACS的verilog_mode脚本

#工作记录# 俗话说不会玩连连看的工程师不是一个好的SoC工程师。 在做集成工作的时候&#xff0c;集成连线估计是一件比较繁琐且容易出错的事情&#xff0c;连线类型定义出错、位宽问题、连线众多等等问题&#xff0c;此时使用由Veripool带来的verilog_mode简直是令人神清气爽…

基于牛顿-拉夫逊优化算法(Newton-Raphson-based optimizer, NBRO)的无人机三维路径规划

牛顿-拉夫逊优化算法(Newton-Raphson-based optimizer, NBRO)是一种新型的元启发式算法&#xff08;智能优化算法&#xff09;&#xff0c;该成果由Sowmya等人于2024年2月发表在中科院2区Top SCI期刊《Engineering Applications of Artificial Intelligence》上。 1、算法原理…

制造运营管理系统(MOM系统),企业实现先进制造的关键一步

随着全球制造业的快速发展&#xff0c;企业对于生产效率和成本控制的要求日益增高。在这个背景下&#xff0c;制造运营管理系统&#xff08;MOM系统&#xff09;成为了企业提升竞争力的关键工具。盘古信息作为业内领先的智能制造解决方案提供商&#xff0c;其MOM系统更是以其卓…

首批通过 | 百度通过中国信通院H5端人脸识别安全能力评估工作

2024年5月&#xff0c;中国信息通信研究院人工智能研究所依托中国人工智能产业发展联盟安全治理委员会&#xff08;AIIA&#xff09;、“可信人脸应用守护计划”及多家企业代表共同开展《H5端人脸识别线上身份认证安全能力要求及评估方法》的编制工作&#xff0c;并基于该方法开…

COD论文笔记 Deep Gradient Learning for Efficient Camouflaged 2022

动机 这篇论文的动机在于解决伪装目标检测(COD)中的一个关键问题&#xff1a;在复杂背景下&#xff0c;伪装目标与背景的边界模糊&#xff0c;使得检测变得极其困难。现有的方法&#xff0c;如基于边界或不确定性的模型&#xff0c;通常仅响应于伪装目标的稀疏边缘&#xff0c…

如何定位Milvus性能瓶颈并优化

假设您拥有一台强大的计算机系统或一个应用&#xff0c;用于快速执行各种任务。但是&#xff0c;系统中有一个组件的速度跟不上其他部分&#xff0c;这个性能不佳的组件拉低了系统的整体性能&#xff0c;成为了整个系统的瓶颈。在软件领域中&#xff0c;瓶颈是指整个路径中吞吐…

价格战再起:OpenAI 发布更便宜、更智能的 GPT-4o Mini 模型|TodayAI

OpenAI 今日推出了一款名为 GPT-4o Mini 的新模型&#xff0c;这款模型较轻便且成本更低&#xff0c;旨在为开发者提供一个经济实惠的选择。与完整版模型相比&#xff0c;GPT-4o mini 在成本效益方面表现卓越&#xff0c;价格仅为每百万输入 tokens 15 美分和每百万输出 tokens…

某4G区域终端有时驻留弱信号小区分析

这些区域其实是长时间处于连接态的电信卡4G终端更容易出现。 出现问题时都是band1 100频点下发了针对弱信号的1650频点的连接态A4测量事件配置&#xff08;其阈值为-106&#xff09;。而这个条件很容易满足&#xff0c;一旦下发就会切到band3 1650频点。 而1650频点虽然下发ban…

神经网络之卷积神经网络

目录 一、卷积神经网络概述&#xff1a;1.卷积层&#xff1a;1.1卷积核与神经元&#xff1a;1.2卷积层作用&#xff1a;1.3多通道概念&#xff1a; 2.池化层&#xff1a;2.1池化层作用&#xff1a; 3.隐藏层与卷积层、池化层关系&#xff1a; 一、卷积神经网络概述&#xff1a;…

Flutter TextFiled频繁采集“剪切板信息”

在使用Flutter开发者&#xff0c;输入框是必不可少的功能&#xff0c;最近产品出了需要&#xff0c;要求输入框记住用户登录过的手机号&#xff0c;并在输入框输入时提示出来&#xff0c;这是个很基础的功能&#xff0c;但是在通过测试验收发布到应用市场时&#xff0c;被Vivo拒…

Spring Boot项目中使用MyBatis Generator (MBG) 自动生成Mapper文件

Spring Boot项目中使用MyBatis Generator (MBG) 自动生成Mapper文件可以很大程度上减少编码。本文着重介绍如何在实战中使用MGB自动生成Mapper文件 1. 添加MyBatis Generator依赖 在pom.xml中添加必要的依赖 <dependency><groupId>org.mybatis.spring.boot</…

uniapp中给data中的变量赋值报错

排查了一上午&#xff0c;原本以为是赋值的这个变量有一个键名是空字符串的问题&#xff0c;后来发现是因为在data中定义变量是写的是{}&#xff0c;如果写成null就不会报错了&#xff0c;具体原因不清楚为什么

逻辑回归(Logistic Regression,LR)

分类和回归是机器学习的两个主要问题。 分类处理的是离散数据回归处理的是连续数据 线性回归&#xff1a;回归 拟合一条线预测函数&#xff1a; 逻辑回归&#xff1a;分类——找到一条线可以将不同类别区分开 虽然称为逻辑回归&#xff0c;但是实际是一种分…

2024 HNCTF PWN(hide_flag Rand_file_dockerfile Appetizers TTOCrv_)

文章目录 参考hide_flag思路exp Rand_file_dockerfile libc 2.31思路exp Appetizers glibc 2.35绕过关闭标准输出实例客户端 关闭标准输出服务端结果exp TTOCrv_&#x1f3b2; glibc 2.35逆向DT_DEBUG获得各个库地址随机数思路exp 参考 https://docs.qq.com/doc/p/641e8742c39…

从零开始学量化~Ptrade使用教程(七)——期权相关操作

期权交易 可点击证券代码右侧的选&#xff0c;进入期权选择菜单。通过选择标的商品&#xff0c;认购期权和认沽期权中间的选项&#xff08;包括代码、成交价、幅度%、隐波%、内在价值、时间价值等&#xff09;&#xff0c;以及认购期权或认沽期权&#xff0c;选择所需的期权标的…

计算机网络入门 -- 常用网络协议

计算机网络入门 – 常用网络协议 1.分类 1.1 模型回顾 计算机网络细分可以划为七层模型&#xff0c;分别是物理层、数据链路层、网络层、传输层、会话层、表示层和应用层。而上三层可以划为应用层中。 1.2 分类 1.2.1 应用层 为用户的应用进程提供网络通信服务&#xff0…

深入浅出WebRTC—DelayBasedBwe

WebRTC 中的带宽估计是其拥塞控制机制的核心组成部分&#xff0c;基于延迟的带宽估计是其中的一种策略&#xff0c;它主要基于延迟变化推断出可用的网络带宽。 1. 总体架构 1.1. 静态结构 1&#xff09;DelayBasedBwe 受 GoogCcNetworkController 控制&#xff0c;接收其输入…

buu--web做题(4)

目录 [BJDCTF2020]ZJCTF&#xff0c;不过如此 [BUUCTF 2018]Online Tool [BJDCTF2020]ZJCTF&#xff0c;不过如此 <?phperror_reporting(0); $text $_GET["text"]; $file $_GET["file"]; if(isset($text)&&(file_get_contents($text,r)&q…

【iOS】——消息传递底层实现

消息传递是什么 Objective-C是一种动态类型语言&#xff0c;这意味着在编译时并不确定对象的具体类型&#xff0c;而是在运行时决定。消息传递机制允许程序在运行时向对象发送消息&#xff0c;对象再决定如何响应这些消息。 当你通过对象调用方法时&#xff0c;例如像这样[ob…