LeetCode每日一题 1019. 链表中的下一个更大节点 --单调栈

这篇具有很好参考价值的文章主要介绍了LeetCode每日一题 1019. 链表中的下一个更大节点 --单调栈。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

 LeetCode每日一题 1019. 链表中的下一个更大节点 --单调栈

Halo,这里是Ppeua。平时主要更新C语言,C++,数据结构算法......感兴趣就关注我吧!你定不会失望。

🌈个人主页:主页链接

🌈算法专栏:专栏链接

     我会一直往里填充内容哒!

🌈LeetCode专栏:专栏链接 

    目前在刷初级算法的LeetBook 。若每日一题当中有力所能及的题目,也会当天做完发出

🌈代码仓库:Gitee链接

🌈点击关注=收获更多优质内容🌈

 

目录

题目:1019. 链表中的下一个更大节点

​编辑题解:

代码实现:

完结撒花:


LeetCode每日一题 1019. 链表中的下一个更大节点 --单调栈

题目:1019. 链表中的下一个更大节点

题解:

简单来说,就是找这个节点前面离他最近的,且比他大的值.

我们可以把这个链表画成这样.

LeetCode每日一题 1019. 链表中的下一个更大节点 --单调栈

那么从右向左遍历,寻找离他最近的比他大的那个数是否就可以看成:找把他挡住的那个数.

我们从后向前遍历这个链表,

然后五没有任何数挡住他,则放入0    ans:[0]

一被五挡住了,所以一最近的比他大的数为五   ans:[0,5]

二也被五挡住了,所以二最近的比他大的数也为五 ans[0,5,5]

再来看一个例子:

LeetCode每日一题 1019. 链表中的下一个更大节点 --单调栈

依旧先把值的图画出来.LeetCode每日一题 1019. 链表中的下一个更大节点 --单调栈

我们从后向前遍历这个链表,

五没有任何数挡住他,则放入0    ans:[0]

三被五挡住了,所以三最近的比他大的数为五   ans:[0,5]

四也被五挡住了,所以四最近的比他大的数也为五 ans:[0,5,5]

七没有任何数挡住他,则放入0  ans:[0,5,5,0]

二被七挡住了,所以离二最近比其大的数字为七 ans:[0,5,5,0,7]

因为我们是反向遍历的,所以最后要将ans 翻转一下就是答案ans:[7,0,5,5,0]

总结下我们这个过程,就是一个单调栈

我们将最后一个元素放入数据顶部,然后在答案数组中存入0(因为是第一个)

之后依次比较

若这个数小于顶部数据,则说明离他最近比他大的就是顶部数据.将其存入栈

若这个数大于顶部数据,则说明顶部数据需要更新了:将顶部数据依次移出,并比较一下其是否还小于这个数.若大于则说明离这个数最近的比他大的数被找到了.

则将顶部数据放入栈.

LeetCode每日一题 1019. 链表中的下一个更大节点 --单调栈

当然最开始要先将链表逆转一下 否则无法从后向前遍历.

LeetCode每日一题 1019. 链表中的下一个更大节点 --单调栈

代码实现:

class Solution {
public:
    vector<int> nextLargerNodes(ListNode* head) {
        ListNode*prev=NULL;
        ListNode*cur=head;
        vector<int>ans;
        while(cur!=NULL){
            ListNode*tmp=cur->next;
            cur->next=prev;
            prev=cur;
            cur=tmp;
        }
        head=prev;
        stack<int>st;
        while(head)
        {
            if(st.empty())
            {
                ans.push_back(0);
                st.push(head->val);
            }
            else if(head->val<st.top())
            {
                ans.push_back(st.top());
                st.push(head->val);
            }
            else if(head->val>=st.top()){
                while(!st.empty())
                {
                    if(st.top()<=head->val)
                        st.pop();
                    else break;
                }
                if(st.empty())
                    ans.push_back(0);
                else
                    ans.push_back(st.top());
                st.push(head->val);
                }
            head=head->next;
        }
        reverse(ans.begin(),ans.end());
        return ans;
    }
};

完结撒花:

🌈本篇博客的内容【LeetCode每日一题 1019. 链表中的下一个更大节点 --单调栈】已经结束。

🌈若对你有些许帮助,可以点赞、关注、评论支持下博主,你的支持将是我前进路上最大的动力。

🌈若以上内容有任何问题,欢迎在评论区指出。若对以上内容有任何不解,都可私信评论询问。

🌈诸君,山顶见!文章来源地址https://www.toymoban.com/news/detail-429550.html

到了这里,关于LeetCode每日一题 1019. 链表中的下一个更大节点 --单调栈的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • (链表) 剑指 Offer 52. 两个链表的第一个公共节点 ——【Leetcode每日一题】

    难度:简单 输入两个链表,找出它们的第一个公共节点。 如下面的两个链表: 在节点 c1 开始相交。 示例 1: 输入:intersectVal = 8, listA = [4,1,8,4,5], listB = [5,0,1,8,4,5], skipA = 2, skipB = 3 输出:Reference of the node with value = 8 输入解释:相交节点的值为 8 (注意,如果两个列表相交则

    2024年02月15日
    浏览(50)
  • 每日一题——判断链表中是否有环

    题目 判断给定的链表中是否有环。如果有环则返回true,否则返回false。 数据范围:链表长度 0≤n≤10000,链表中任意节点的值满足 ∣val∣=100000 要求:空间复杂度 O(1),时间复杂度 O(n) 输入分为两部分,第一部分为链表,第二部分代表是否有环,然后将组成的head头结点传入到

    2024年02月16日
    浏览(50)
  • 每日一题(链表中倒数第k个节点)

    链表中倒数第k个结点_牛客网 (nowcoder.com) 思路: 如下图所示:此题仍然定义两个指针,fast指针和slow指针,假设链表的长度是5,k是3,那么倒数第3个节点就是值为3的节点。那么我们可以先让fast指针向后走k次,也就是3次。slow指针仍然指向头节点。 当fast向后走3步之后,如下图

    2024年02月10日
    浏览(35)
  • 【每日一题】填充每个节点的下一个右侧节点指针 II

    【BFS】【树】【2023-11-03】 117. 填充每个节点的下一个右侧节点指针 II 为二叉树中的每一个节点填充下一个节点。 本题题目意思明确,我们只需要遍历二叉树每一层的节点,将节点的 next 指针指向同一层的下一个节点即可,属于二叉树层序遍历的基础题。 实现代码 复杂度分

    2024年02月05日
    浏览(38)
  • (链表) 143. 重排链表 ——【Leetcode每日一题】

    难度:中等 给定一个单链表 L 的头节点 head ,单链表 L 表示为: L 0 L_0 L 0 ​ → L 1 L_1 L 1 ​ → … → L n − 1 L_{n-1} L n − 1 ​ → L n L_n L n ​ 请将其重新排列后变为: L 0 L_0 L 0 ​ → L n L_n L n ​ → L 1 L_1 L 1 ​ → L n − 1 L_{n-1} L n − 1 ​ → L 2 L_2 L 2 ​ → L n − 2 L_{n-2} L n −

    2024年02月08日
    浏览(45)
  • (链表专题) 725. 分隔链表 ——【Leetcode每日一题】

    给你一个头结点为 head 的单链表和一个整数 k ,请你设计一个算法将链表分隔为 k 个连续的部分。 每部分的长度应该尽可能的相等:任意两部分的长度差距不能超过 1 。这可能会导致有些部分为 null 。 这 k 个部分应该按照在链表中出现的顺序排列,并且排在前面的部分的长

    2023年04月17日
    浏览(38)
  • ( 链表) 203. 移除链表元素 ——【Leetcode每日一题】

    难度:简单 给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回 新的头节点 。 示例 1: 输入:head = [1,2,6,3,4,5,6], val = 6 输出:[1,2,3,4,5] 示例 2: 输入:head = [], val = 1 输出:[] 示例 3: 输入:head = [7,7,7,7], val = 7 输出:[] 提示:

    2024年02月06日
    浏览(58)
  • Leetcode-每日一题【61.旋转链表】

    给你一个链表的头节点  head  ,旋转链表,将链表每个节点向右移动  k   个位置。 示例 1: 输入:head = [1,2,3,4,5], k = 2 输出:[4,5,1,2,3] 示例 2:   输入: head = [0,1,2], k = 4 输出: [2,0,1] 提示: 链表中节点的数目在范围  [0, 500]  内 -100 = Node.val = 100 0 = k = 2 * 109 1.根据题目给出

    2024年02月11日
    浏览(36)
  • Leetcode-每日一题【206.反转链表】

    给你单链表的头节点  head  ,请你反转链表,并返回反转后的链表。 示例 1: 输入: head = [1,2,3,4,5] 输出: [5,4,3,2,1] 示例 2: 输入:head = [1,2] 输出:[2,1] 示例 3: 输入:head = [] 输出:[] 提示: 链表中节点的数目范围是 [0, 5000] -5000 = Node.val = 5000   1.我们遍历链表,首先设置

    2024年02月12日
    浏览(35)
  • Leetcode-每日一题【143.重排链表】

    给定一个单链表  L   的头节点  head  ,单链表  L  表示为: 请将其重新排列后变为:  不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。 示例 1:     输入: head = [1,2,3,4,5] 输出: [1,5,2,4,3] 提示: 链表的长度范围为  [1, 5 * 104] 1 = node.val = 1000 1.首先我们

    2024年02月11日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包