Leetcode1019. 链表中的下一个更大节点(golang)

一、题目

题目来源:https://leetcode-cn.com/problems/next-greater-node-in-linked-list/

给出一个以头节点 head 作为第一个节点的链表。链表中的节点分别编号为:node_1, node_2, node_3, ...

每个节点都可能有下一个更大值(next larger value):对于 node_i,如果其 next_larger(node_i)node_j.val,那么就有 j > inode_j.val > node_i.val,而 j 是可能的选项中最小的那个。如果不存在这样的 j,那么下一个更大值为 0

返回整数答案数组 answer,其中 answer[i] = next_larger(node_{i+1})

注意:在下面的示例中,诸如 [2,1,5] 这样的输入(不是输出)是链表的序列化表示,其头节点的值为 2,第二个节点值为 1,第三个节点值为 5 。

  • 示例 1:

输入:[2,1,5]
输出:[5,5,0]

  • 示例 2:

输入:[2,7,4,3,5]
输出:[7,0,5,5,0]

  • 示例 3:

输入:[1,7,5,1,9,2,5,1]
输出:[7,9,9,9,0,5,0,0]

  • 提示:

对于链表中的每个节点,1 <= node.val <= 10^9
给定列表的长度在 [0, 10000] 范围内

二、题解

利用单调栈求解:

具体思想见笔者图示与代码注释

图示如下:

在这里插入图片描述

代码

func nextLargerNodes(head *ListNode) []int {
    
    
	//首先遍历链表,将链表的值入数组arr
    var arr []int
    for head != nil{
    
    
        arr = append(arr, head.Val)
        head = head.Next
    }
    //定义最后的返回数组result和栈stack,长度为链表也就是arr的长度
    //注意:go语言中int类型默认值为0,[]int,即默认为[0]
    result, stack := make([]int, len(arr)), make([]int, len(arr))
    //遍历数组arr
    for index := 0; index < len(arr); index++{
    
    
        //当栈为空的时候将数组下标入栈
        //之所以入下标而不直接入值是为了在result中找到并修改对应index下标的位置
        if len(stack) == 0{
    
    
            stack = append(stack, index)
        }else{
    
      //如果栈中已有元素,那么开始循环比较
            //若此时的index对应的值大于stack栈顶元素坐标对应的值,就将栈顶元素出栈
            for len(stack) > 0 && arr[index] > arr[stack[len(stack)-1]]{
    
    
                //将栈顶元素坐标赋给pop,用于出栈
                pop := len(stack) - 1
                //并改变result中对应栈顶元素坐标位置的值为index对应值(也就是当前最大值)
                result[stack[pop]] = arr[index]
                //弹出栈顶元素
                stack = stack[:pop]
            }
            //循环完毕,直至栈中没有比index对应值更大的数,就将该最大值坐标index入栈
            stack = append(stack, index)
        }
        
    }
    //返回result
    return result
}

猜你喜欢

转载自blog.csdn.net/QQ395879676/article/details/115640910
今日推荐