インタビューの質問はブラッシングする必要があります:単調なスタックpythonテンプレートルーチン(使用例の詳細な説明付き)

単調なスタックの問題:

単調スタックがどのような問題に適しているかを知るには、最初に単調スタックの役割を知る必要があります。単調スタックは、単調増加スタックと単調減少スタックに分けられます。単調スタックを使用することで、彼よりも大きい(または小さい)次の要素にアクセスできます(またはアクセスできます)。

つまり、キューまたは配列では、問題を解決するために要素のサイズ関係を前後で比較する必要がある場合、通常は単調なスタックを使用します。以下では、単調スタックの削減と単調増加のスタックの問題を簡単に紹介し、単調スタックを使用して問題を解決するプロセスをさらに説明します。

単調なスタックを使用するのはいつですか?
通常は1次元配列です。それ自体よりも大きい(小さい)要素の右側(左側)にある最初の要素を見つける必要があり、O(n)の時間計算量が必要です。

単調スタックの原則:

単調に増加するスタック:スタックの最下部から最上部に向かって増加し、スタックの最上部が大きくなります
単調に減少するスタック:スタックの最下部から最上部に向かって減少し、スタックの最上部が小さくなります

Pythonテンプレートルーチン:

1):右側の現在のアイテムについて、それ自体よりも大きい最初の位置を見つけます-右から左に単調に減少するスタックを維持します。

def nextGreaterElement_01(nums: list):
    length = len(nums)
    res, stack = [-1] * length, []

    for i in range(length - 1, -1, -1):
        while stack and stack[-1] <= nums[i]:
            stack.pop()
        if stack:
            res[i] = stack[-1]
        stack.append(nums[i])

    return res

または、右側の現在のアイテムを見つけて、それ自体よりも大きい最初の位置を見つけます-左から右に単調に減少するスタックを維持します。

def nextGreaterElement_011(nums: list):
    length = len(nums)
    res, stack = [-1] * length, []

    for i in range(length):
        while stack and nums[stack[-1]] < nums[i]:
            idx = stack.pop()
            res[idx] = nums[i]
        stack.append(i)

    return res

2):右側の現在のアイテムについて、それ自体よりも小さい最初の位置を見つけます-右から左に単調に増加するスタックを維持します

def nextGreaterElement_02(nums: list):
    length = len(nums)
    res, stack = [-1] * length, []

    for i in range(length - 1, -1, -1):
        while stack and stack[-1] >= nums[i]:
            stack.pop()
        if stack:
            res[i] = stack[-1]
        stack.append(nums[i])

    return res

3):左側の現在のアイテムについて、それ自体よりも大きい最初の位置を見つけます-左から右に単調に減少するスタックを維持します

def nextGreaterElement_03(nums: list):
    length = len(nums)
    res, stack = [-1] * length, []

    for i in range(length):
        while stack and stack[-1] <= nums[i]:
            stack.pop()
        if stack:
            res[i] = stack[-1]
        stack.append(nums[i])

    return res

4):左側の現在のアイテムについて、それ自体よりも小さい最初の位置を見つけます-左から右に単調に増加するスタックを維持します

def nextGreaterElement_04(nums: list):
    length = len(nums)
    res, stack = [-1] * length, []

    for i in range(length):
        while stack and stack[-1] >= nums[i]:
            stack.pop()
        if stack:
            res[i] = stack[-1]
        stack.append(nums[i])

    return res

参照元:https//leetcode-cn.com/problems/next-greater-element-i/solution/dan-diao-zhan-zong-jie-by-wu-xian-sen-2/

おすすめ

転載: blog.csdn.net/weixin_44414948/article/details/114385843