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,一经查实,立即删除!

相关文章

力扣第十八题——四数之和

内容介绍 给你一个由 n 个整数组成的数组 nums &#xff0c;和一个目标值 target 。请你找出并返回满足下述全部条件且不重复的四元组 [nums[a], nums[b], nums[c], nums[d]] &#xff08;若两个四元组元素一一对应&#xff0c;则认为两个四元组重复&#xff09;&#xff1a; 0…

jenkins 插件版本冲突

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

protoc-gen-go-http: program not found or is not executable

# 1 先升级到最新版 sudo kratos upgrade # 2 安装 protoc-gen-go-http go get -u github.com/go-kratos/kratos/cmd/protoc-gen-go-http/v2 go install github.com/go-kratos/kratos/cmd/protoc-gen-go-http/v2 # 3 安装 protoc-gen-go-errors go get -u github.com/go-…

【工具使用】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;并基于该方法开…

大数据时代,如何用Scikit-Learn高效转换数据?

大数据时代&#xff0c;如何用Scikit-Learn高效转换数据&#xff1f; 在数据科学领域&#xff0c;数据预处理是至关重要的一步。Scikit-Learn&#xff08;简称sklearn&#xff09;&#xff0c;作为Python中最受欢迎的机器学习库之一&#xff0c;提供了一系列的数据转换工具&am…

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

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

DM数据库导出excel表结构

select utc.column_name 字段名, utc.data_type 字段类型, utc.data_length 数据长度, utc.data_precision 数据精度, utc.nullable 是否为空 , ucc.comments 备注 from user_tab_columns utc,user_col_comments ucc where utc.column_name ucc.column_name and utc.Table_Nam…

.NET单元测试使用AutoFixture按需填充的方法总结

AutoFixture是一个.NET库&#xff0c;旨在简化单元测试中的数据设置过程。通过自动生成测试数据&#xff0c;它帮助开发者减少测试代码的编写量&#xff0c;使得单元测试更加简洁、易读和易维护。AutoFixture可以用于任何.NET测试框架&#xff0c;如xUnit、NUnit或MSTest。 默…

如何定位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…

区块链技术和系统;ZKRollup ;区块链交易打包和审查

目录 区块链技术和系统 ZKRollup 的基本概念和运作原理 基本概念 运作原理 交易打包和审查 一、交易打包 二、交易审查 区块链技术和系统 区块链技术作为一种去中心化、不可篡改且高度安全的分布式账本技术,近年来在金融科技、供应链管理、物联网、版权保护、投票系统…

神经网络之卷积神经网络

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

vue3 页面引入组件

子组件内容 注意这里的 name: "Rabbitmq"&#xff0c;要与下面引用的时候一致 <template><div><!-- 你的组件内容 --><div slot"footer" class"dialog-footer"><el-button type"primary" click"sub…

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

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

求职学习day6

起来还是刷了一小时视频。还是没办法元气满满的起床。 一个新的集中注意力的办法&#xff0c;屏幕使用时间限制。 计划 CodeTop 面试题目总结 接下来的刷题主要是codetop100 9:40-10:20主要练习自我介绍。 面试到11点&#xff0c;开始做平安的题目&#xff0c;然后去广州…

谷粒商城实战笔记-35-前端基础-ES6-模块化

文章目录 一&#xff0c;什么是模块化二&#xff0c;export1. export语法2. 批量导出3. 默认导出 三&#xff0c;import1&#xff0c;import语法2&#xff0c;批量导入 一&#xff0c;什么是模块化 模块化编程是一种软件设计技术&#xff0c;它将程序分解为独立的、可复用的部…