ARTS第八周

博客围绕LeetCode 1019题Next Greater Node In Linked List展开,题目要求找出链表中每个节点后第一个比它大的值,若不存在则为0。给出多个示例,解题思路是使用单调栈,若当前数比栈顶数大,确定栈顶元素对应结果并使其出栈。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Algorithm

LeetCode 1019. Next Greater Node In Linked List

We are given a linked list with head as the first node. Let’s number the nodes in the list: node_1, node_2, node_3, … etc.

Each node may have a next larger value: for node_i, next_larger(node_i) is the node_j.val such that j > i, node_j.val > node_i.val, and j is the smallest possible choice. If such a j does not exist, the next larger value is 0.

Return an array of integers answer, where answer[i] = next_larger(node_{i+1}).

Note that in the example inputs (not outputs) below, arrays such as [2,1,5] represent the serialization of a linked list with a head node value of 2, second node value of 1, and third node value of 5.

Example 1:
Input: [2,1,5]
Output: [5,5,0]

Example 2:
Input: [2,7,4,3,5]
Output: [7,0,5,5,0]

Example 3:
Input: [1,7,5,1,9,2,5,1]
Output: [7,9,9,9,0,5,0,0]

Note:

  1. 1 <= node.val <= 10^9 for each node in the linked list.
  2. The given list has length in the range [0, 10000].

这道题是的题意是找出每个数字后边的第一个比它大的。也就是找最近的大于它的值。
刚看到这道题,就想到了单调栈的思路。以上的关系设为f(i)=j,i右边最大的数是j
如果当前的数比栈顶的数大, 那么f(s.top()) = i,这是已经确定该栈顶元素就可以出栈了。
具体实现看代码

public int[] nextLargerNodes(ListNode head) {
    if (head == null) return null;
    LinkedList<Pair> list = new LinkedList<>();
    int[] maxRecentRight = new int[10005];
    ListNode node = head;
    int i;
    for (i = 0; node != null; node = node.next, i++) {
        Pair x;
        while (list.size() > 0 && node.val > (x = list.getLast()).getNode().val) {
            maxRecentRight[x.getPosition()] = node.val;
            list.removeLast();
        }
        x = new Pair(i, node);
        list.addLast(x);
    }
    while (list.size() > 0) {
        Pair x = list.removeLast();
        maxRecentRight[x.getPosition()] = 0;
    }
    return Arrays.copyOf(maxRecentRight, i);
}

Tip

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值