LeetCode 每日一题 Day 32 ||递归单调栈

2487. 从链表中移除节点

给你一个链表的头节点 head 。

移除每个右侧有一个更大数值的节点。

返回修改后链表的头节点 head 。

示例 1:
在这里插入图片描述

输入:head = [5,2,13,3,8]
输出:[13,8]
解释:需要移除的节点是 5 ,2 和 3 。

  • 节点 13 在节点 5 右侧。
  • 节点 13 在节点 2 右侧。
  • 节点 8 在节点 3 右侧。

示例 2:

输入:head = [1,1,1,1]
输出:[1,1,1,1]
解释:每个节点的值都是 1 ,所以没有需要移除的节点。

提示:

给定列表中的节点数目在范围 [1, 105] 内
1 <= Node.val <= 1e5

既然题目要倒着看最大值,明显可以用到递归,利用递归确定每个数右侧都是比他大的:

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    ListNode* removeNodes(ListNode* head) {
        if(head -> next == nullptr) {
            return head;
        }
        ListNode* node = removeNodes(head -> next);
        if(node -> val > head -> val) {
            return node;
        }
        head -> next = node;
        return head;
    }
};

看完题解后还有另外的解法,也就是单调栈

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    ListNode* removeNodes(ListNode* head) {
        ListNode* dummy = new ListNode(0, head);
        ListNode* cur = head;
        vector<ListNode*> stk;
        for (ListNode* cur = head; cur; cur = cur->next) {
            while (stk.size() && stk.back()->val < cur->val) {
                stk.pop_back();
            }
            if (stk.size()) {
                stk.back()->next = cur;
            } else {
                dummy->next = cur;
            }
            stk.push_back(cur);
        }
        return dummy->next;
    }
};

灵神题解中还用了迭代来做:

class Solution {
    ListNode *reverseList(ListNode *head) {
        ListNode *pre = nullptr, *cur = head;
        while (cur) {
            ListNode *nxt = cur->next;
            cur->next = pre;
            pre = cur;
            cur = nxt;
        }
        return pre;
    }
public:
    ListNode *removeNodes(ListNode *head) {
        head = reverseList(head);
        ListNode *cur = head;
        while (cur->next) {
            if (cur->val > cur->next->val) {
                cur->next = cur->next->next;
            } else {
                cur = cur->next;
            }
        }
        return reverseList(head);
    }
};

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

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

相关文章

你的网站或许不需要前端构建(二)

前一阵&#xff0c;有朋友问我&#xff0c;能否在不进行前端编译构建的情况下&#xff0c;用现代语法开发网站界面。 于是&#xff0c;就有了这篇文章中提到的方案。 写在前面 这篇文章&#xff0c;依旧不想讨论构建或不构建&#xff0c;哪一种方案对开发更友好&#xff0c;…

手机视频监控客户端APP如何实现跨安卓、苹果和windows平台,并满足不同人的使用习惯

目 录 一、手机视频监控客户端的应用和发展 二、手机视频监控客户端存在的问题 三、HTML5视频监控客户端在手机上实现的方案 &#xff08;一&#xff09;HTML5及其优点 &#xff08;二&#xff09;HTML5在手机上实现视频应用功能的优势 四、手机HTML5…

Python使用selenium自动爬取苏宁易购商品数据

嗨喽~大家好呀&#xff0c;这里是魔王呐 ❤ ~! python更多源码/资料/解答/教程等 点击此处跳转文末名片免费获取 环境介绍: python 3.8 pycharm 专业版 selenium 谷歌浏览器 浏览器驱动 selenium: 人是怎么操作浏览器的 那么代码就怎么写 代码思路 开启一个浏览器 (谷歌…

2024年需要关注的主要AI趋势

文 | BFT机器人 在2023年的时候&#xff0c;很少一部分专家预测人工智能将对IT、业务和整个世界产生影响。在2024年的伊始&#xff0c;是时候期待新的一年以及关注了解一下2024年AI进步的趋势了。 大模型助力人工智能 2024年的AI趋势将是ChatGPT等大型语言模型&#xff08;LLM…

每日算法打卡:递归实现组合型枚举 day 4

文章目录 原题链接题目描述输入格式输出格式数据范围输入样例&#xff1a;输出样例&#xff1a; 题目分析示例代码优化 原题链接 93. 递归实现组合型枚举 题目难度&#xff1a;简单 题目来源&#xff1a;《算法竞赛进阶指南》 题目描述 从 1∼n 这 n 个整数中随机选出 m 个…

前端项目打包并部署

一、vue项目打包 1.1 方式一&#xff1a;vue项目命令行打包 在当前项目路径下&#xff0c;执行命令 npm run build 在当前项目路径下&#xff0c;生成 一个dist文件夹。 将来部署项目&#xff0c;是部署的dist这个文件。 1.2 方式二&#xff1a;使用vue ui打包项目 在终端中…

离线部署的MinIO

网络有不同的部分&#xff0c;例如 DMZ、公共、私有、堡垒等。这实际上取决于您的组织和网络要求。在部署应用程序时&#xff0c;任何应用程序&#xff0c;我们都需要考虑类型以及它是否需要位于网络的特定部分。 例如&#xff0c;如果要部署数据库&#xff0c;则不希望它位于…

Hubery-个人项目经历记录

研究生期间很有幸的进入到了崔老师的组&#xff0c;从此也就进入到了分析人体生理信号的领域&#xff0c;充满挑战的同时也充满了乐趣。借着CSDN整理一下近几年来参与的项目&#xff0c;这里蕴含着我各种美好的回忆&#xff0c;也作为一个展示自己的平台吧。 开始之前&#xff…

CSS效果(工作中常用)

1、css文字溢出省略号 overflow: hidden; // 溢出隐藏 text-overflow: ellipsis; // 溢出用省略号显示 white-space: nowrap; // 规定段落中的文本不进行换行 overflow: hidden; // 溢出隐藏 text-overflow: ellipsis; // 溢出用省略…

磁盘管理------逻辑卷、磁盘配额

目录 引导语&#xff1a; 一、逻辑卷 &#xff08;一&#xff09;逻辑卷的概念 &#xff08;二&#xff09;建立逻辑卷 1.新建磁盘 2.创建物理卷 3.创建卷组 4.创建逻辑卷 5.挂载 6.使用分区创建逻辑卷 &#xff08;三&#xff09;磁盘扩容 1.创建新的物理卷 2.扩容…

everything 本地文件搜索工具 完胜WIndows搜索 速度99% 超级给力

"Everything" 是一个 Windows 平台上的免费软件&#xff0c;它是一款功能强大的本地文件搜索工具。它允许用户在计算机上快速而准确地搜索文件和文件夹。以下是一些 "Everything" 的主要特点&#xff1a; 实时搜索&#xff1a; "Everything" 提供…

U盘数据恢复软件,高效恢复数据记好这2款!

“我的u盘用了很久了&#xff0c;有时候会遇到u盘数据丢失的情况。想问问大家有什么比较好用的u盘数据恢复软件可以推荐吗&#xff1f;” 在Windows电脑上&#xff0c;U盘已成为我们存储和传输数据的常用设备。然而&#xff0c;由于各种原因&#xff0c;U盘中的数据可能会丢失或…

arm64操作系统LLVM源码编译

编译electron需要对应版本的LLVM编译器,因此需要构建arm64版本的LLVM。构建过程如下。 一、编译环境 需要cmake版本大于3.20,因此需要更新cmake cmake源码下载地址:Download CMake Download CMake 下载后解压编译 tar -zxvf cmake-3.28.1.tar.gz cd cmake-3.28.1 mkdir…

计算机毕业设计------基于SpringCloud的实验室管理系统

项目介绍 实验室管理系统的用户可以分为两种&#xff1a;系统管理员和普通用户。系统管理员主要功能&#xff1a; 登录登出、分析数据、管理用户、管理日志、管理实验室、管理预约、维护个人资料、实验室保修管理 用户主要功能&#xff1a; 注册登录、查询实验室、实验室预约…

大数据开发的专业术语

&#x1f339;作者主页&#xff1a;青花锁 &#x1f339;简介&#xff1a;Java领域优质创作者&#x1f3c6;、Java微服务架构公号作者&#x1f604; &#x1f339;简历模板、学习资料、面试题库、技术互助 &#x1f339;文末获取联系方式 &#x1f4dd; 系列专栏目录 [Java项…

C语言中指针变量如何使用

一、指针变量的定义与声明 1.1 定义 指针变量是用来存储另一个变量的内存地址的变量。在C语言中&#xff0c;指针变量的类型是指向某个类型的指针。例如&#xff0c;int *p; 表示一个整型指针变量p。 1.2 声明 指针变量的声明分为两种形式&#xff0c;一种是直接声明&#…

高管换防,年度销量缺口较大,朱华荣掌舵的阿维塔前路在何方?

高管换防下&#xff0c;阿维塔的压力依然不小。 阿维塔前任CEO谭本宏曾将汽车行业的角逐比喻为一场全程马拉松&#xff0c;“有的人开始跑的很快&#xff0c;结果跑到15公里就被迫下场&#xff0c;就是因为节奏和动作变形”。在他看来&#xff0c;设立合理的目标与发展节奏&am…

.cer格式证书文件和 .pfx格式证书文件有什么区别?

这里我们将讨论.cer和.pfx文件类型之间的差异。 什么是数字证书&#xff1f; 数字证书在电子通信中用作验证身份的密码机制。我们需要这些证书来建立安全的在线通信渠道&#xff0c;并确保数字数据的隐私、真实性和正确性。 数字证书包括主题&#xff08;实体详细信息&#xf…

阿里云PolarDB数据库不同配置租用价格表

阿里云数据库PolarDB租用价格表&#xff0c;云数据库PolarDB MySQL版2核4GB&#xff08;通用&#xff09;、2个节点、60 GB存储空间55元5天&#xff0c;云数据库 PolarDB 分布式版标准版2核16G&#xff08;通用&#xff09;57.6元3天&#xff0c;阿里云百科aliyunbaike.com分享…
最新文章