Skip to content

[LeetCode] 1019. 链表中的下一个更大节点 #41

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
Animenzzzz opened this issue Aug 14, 2019 · 0 comments
Open

[LeetCode] 1019. 链表中的下一个更大节点 #41

Animenzzzz opened this issue Aug 14, 2019 · 0 comments

Comments

@Animenzzzz
Copy link
Owner

题目描述:

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

每个节点都可能有下一个更大值(next larger value):对于 node_i,如果其 next_larger(node_i) 是 node_j.val,那么就有 j > i 且  node_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] 范围内

解题思路:先遍历一遍链表,将元素的顺序逆序存进容器。然后遍历容器,栈ss的栈顶元素大于当前的元素。首先是弹栈操作:如果栈顶小于等于当前元素,则一直出栈。
如果此时栈不为空,则此元素右边第一个比他大的就是这个栈顶的元素,同时此元素要放入栈中(因为要和下一个元素即左边的再比较),然后元素继续往左移。
如果此时栈为空,则说明右边没有比他再大的元素了,则此时位置为0,同时此元素要放入栈中(因为要和下一个元素即左边的再比较),然后元素继续往左移。

C++解题:

class Solution {
public:
    vector<int> nextLargerNodes(ListNode* head) {
        vector<int> nodeArray;
        vector<int> result;
        stack<int> ss;
        while (head)
        {
            nodeArray.push_back(head->val);
            head = head->next;
        }
        while (!nodeArray.empty())
        {
            if (ss.empty())
            {
                result.push_back(0);
                ss.push(nodeArray.back());
                nodeArray.pop_back();
            }else{
                while (!ss.empty() && ss.top() <= nodeArray.back()) ss.pop();
                if(!ss.empty()){
                    result.push_back(ss.top());
                    ss.push(nodeArray.back());
                    nodeArray.pop_back();
                }
            }
        }
        vector<int> result_res;
        while (!result.empty())
        {
            result_res.push_back(result.back());
            result.pop_back();
        }
        return result_res;
    }
};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant