LeetCode-Python-1019. チェーンテーブルの次の大きなノード

2191 ワード

ヘッダノードheadを第1のノードとするチェーンテーブルが与えられる.チェーンテーブルのノード番号は、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、2番目のノードの値が1、3番目のノードの値が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]の範囲内
  • である.
    # Definition for singly-linked list.
    # class ListNode(object):
    #     def __init__(self, x):
    #         self.val = x
    #         self.next = None
    
    class Solution(object):
        def nextLargerNodes(self, head):
            """
            :type head: ListNode
            :rtype: List[int]
            """
            h = head
            l = list()
            while(h): #             
                l.append(h.val)
                h = h.next
                
            stack = list()
            res = [0 for i in range(len(l))]
            
            cnt = 0
            while(cnt < len(l)): #        
                if not stack or l[stack[-1]] >= l[cnt]: #  stack  ,                    
                    stack.append(cnt)#           
                else:#                 ,                 
                    while(stack and l[stack[-1]] < l[cnt]): #    ,            
                        res[stack[-1]] = l[cnt]                    
                        stack.pop()
                    stack.append(cnt) #        
                    
                cnt += 1
                
            return res
            

    一反三を挙げると、本題は以下の問題と同類の問題です.
    LeetCode-Python-503. 次の大きな要素II
    LeetCode-Python-739. 毎日の温度
    LeetCode-Python-496. 次の大きな要素I
    LeetCode-Python-1030. チェーンテーブルの次の大きなノード