Leetcode 496 503と739件の質問とスタック・ソリューションを使用することを理解して

答えの対象

496タイトル
  • leetcode 496タイトル説明

二つの配列が重複する要素とnums2をnums1ない与え、前記nums1はnums2のサブセットです。Nums1はnums2の各要素が値よりも大きくなっている下にあります。
次に高い要素数が第一の要素にnums1 X X X対応する参照はnums2に正しい位置よりも大きくなっています。ない場合は、位置出力は-1に対応します。
入力:nums1 = [4,1,2] nums2 = [1,3,4,2]
出力:[1,3、-1]は、
具体的に説明:スキップを

  • 答え
  1. 主にスタックデータ構造のためにスタックデータ構造とノウハウ、そして思慮深い表情たら、おそらくクリアすることができ、可能性が低いです。
  2. 答え固有のアイデア:
    • 、単調減少スタックを維持A [2] A [1]よりも大きい場合、まず、スタックは、スタック上に第1の要素A [1]は空である、でA [2] A [1]であることを示しています最大の要素、スタックからA [1]、[2]スタック。A [3]、A [2]、その後、A [3]スタック未満の場合。即ち、順次下から上へのスタックの要素が減少しています。
    • 各要素nums2次の最大値を使用して、ハッシュテーブルメンテナンス。便利nums1ができた後。
      Pythonコードのあまりの特定のバージョンは次のとおりです。
    def nextGreaterElement(self, nums1, nums2):
        """
        :type nums1: List[int]
        :type nums2: List[int]
        :rtype: List[int]
        """
        nums2_dict = {}
        stack = []
        res = [-1] * len(nums1)
        for num in nums2:
            while stack and stack[-1] < num:
                nums2_dict[stack[-1]] = num
                stack.pop()
            stack.append(num)
        for i in range(len(nums1)):
            if nums1[i] in nums2_dict.keys():
                res[i] = nums2_dict[nums1[i]]
        return res
739件の質問、毎日温度
  1. タイトル説明

毎日の温度のリストによると、リストを再構築し、対応する位置を入力します。あなたは、温度がその日の日数を超えて上昇するまで待機する必要がどのくらいです。すべての後、増加していない場合は、代わりの場所に0を使用してください。
例えば、温度= [73、74、75のリストを与えられ 、71、69、72、76、73]、 次の[1、1、4、2、1、1、0、0]出力であるべきです。

  1. タイトルはちょうど別の質問は、それの次の大きな要素を検索するように要求されている、完全にインストールされて上記対象に答えるためにアイデアを考えます。メンテナンススタックはまだ単調に減少しているが、スタック内の温度ではない要素が、標準の下で、この問題への完璧な解決策になることができます。
  2. 可能性のあるコード
    def dailyTemperatures(self, T):
        """
        :type T: List[int]
        :rtype: List[int]
        """
        res = [0] * len(T)
        stack = []
        for i in range(len(T)):
            while stack and T[stack[-1]] < T[i]:
                res[stack[-1]] = i - stack[-1]
                stack.pop()
            stack.append(i)
        return res
質問次の503最大の要素2
  1. タイトル説明

ループアレイ(次の要素の最後の要素は、配列の最初の要素である)、次に高い素子の各素子の出力を与えられ。より多くのxの次の要素は、あなたがより多くのその次のサイクルを検索する必要があることを意味し、この番号の後の最初の数、より大きな配列横断順序に基づいています。そうでない場合は、-1の出力されます。
例:
入力:[1,2,1]
出力:[2、1,2]
説明:第一次のより高い数は1~2であり、
数2は、より大きい番号を見つけることができない。
第一サイクルの次の二つの最大数の1は結果が2で、検索を必要としました。

答えへのアイデア

リスト中の話題の主な難しさは、サイクルので、それは上記の点に比べて最大の違いです。私は最善のアプローチは、最終的なスタックを取得するために起動し、スタックの要素の次の最大の要素の位置を取得するには、どこへ行くリストについては、スタックと表情の要素をトラバースすることだと思います。
具体的なコードは次のよう:

    def nextGreaterElements(self, nums):
        """
        :type nums: List[int]
        :rtype: List[int]
        """
        res = [-1] * len(nums)
        stack = []
        for i in range(len(nums)):
            while stack and nums[stack[-1]] < nums[i]:
                res[stack[-1]] = nums[i]
                stack.pop()
            stack.append(i)
        while stack:
            for i in range(stack[-1]):
                if nums[i] > nums[stack[-1]]:
                    res[stack[-1]] = nums[i]
                    break
            stack.pop()
        return res

このアルゴリズムはまた、持っていたが、それには二回だけで、スタック内のリスト要素に、唯一の答えを見つけるために見て、いくつかのわずかに高い時間複雑さ、することができます。私は期待していませんでした。書き込みしないように特定のコード。

最終的な考え

大半は、スタックデータ構造は第一のものの後に、非常にシンプルなああ、と感じるようになった、とどんな困難がない場所にはありません。後で発見するだけ。よりシンプルなデータ構造は、問題解決への応用を考えることは容易ではありません。また、どのように適用するか、どのように適用するか、これが最も難しい部分です。努力はまだ学ぶことがたくさん練習する必要があります。

ローマは一日にして成らず。コード農家の努力〜さあ

公開された11元の記事 ウォンの賞賛1 ビュー9973

おすすめ

転載: blog.csdn.net/weixin_41850360/article/details/104433341