(適合初學者)下一個更大元素

weixin_46347928發表於2020-10-05

(適合初學者)下一個更大元素

今天是我寫部落格第三天,希望自己能夠一直堅持下去,今天練習的題目有點小小難,研究好久,開始利用比較暴力的方法進行寫的,我又研究一下,單調棧,沒感覺到差到哪裡了,下面我們們一起看題吧:
給定兩個 沒有重複元素 的陣列 nums1 和 nums2 ,其中nums1 是 nums2 的子集。找到 nums1 中每個元素在 nums2 中的下一個比其大的值。

nums1 中數字 x 的下一個更大元素是指 x 在 nums2 中對應位置的右邊的第一個比 x 大的元素。如果不存在,對應位置輸出 -1 。

示例 1:

輸入: nums1 = [4,1,2], nums2 = [1,3,4,2].
輸出: [-1,3,-1]
解釋:
對於num1中的數字4,你無法在第二個陣列中找到下一個更大的數字,因此輸出 -1。
對於num1中的數字1,第二個陣列中數字1右邊的下一個較大數字是 3。
對於num1中的數字2,第二個陣列中沒有下一個更大的數字,因此輸出 -1。
示例 2:

輸入: nums1 = [2,4], nums2 = [1,2,3,4].
輸出: [3,-1]
解釋:
對於 num1 中的數字 2 ,第二個陣列中的下一個較大數字是 3 。
對於 num1 中的數字 4 ,第二個陣列中沒有下一個更大的數字,因此輸出 -1 。

以上一定要仔細看,慢慢理解上面的,才能懂得這個演算法的核心,下面看看方法一:
方法一:

class Solution1:
    def nextGreaterElement(self, nums1, nums2):
        dic = {}#建立字典

        for i in range(len(nums2)):#迴圈遍歷
            j = i + 1
            while j < len(nums2) and nums2[i] >= nums2[j]:
                j += 1
            if j < len(nums2) and nums2[i] < nums2[j]:
                dic[nums2[i]] = nums2[j]
        return [dic.get(x, -1) for x in nums1]
s=Solution3()
num1=[4,1,3]
num2=[3,1,4,2]
print(s.nextGreaterElement(num1,num2))

執行結果:D:\python\python.exe C:/Users/ASUS/PycharmProjects/pythonProject1/最大數.py
[-1, 4, 4]
方法二:

class Solution3:
    def nextGreaterElement(self, nums1, nums2):
        dic, stack = {}, []

        for i in range(len(nums2)):
            while stack and stack[-1] < nums2[i]:
                dic[stack.pop()] = nums2[i]
            stack.append(nums2[i])

        return [dic.get(x, -1) for x in nums1]


s=Solution3()
num1=[4,1,3]
num2=[3,1,4,2]
print(s.nextGreaterElement(num1,num2))

執行結果:D:\python\python.exe C:/Users/ASUS/PycharmProjects/pythonProject1/最大數.py
[-1, 4, 4]

相關文章