下一个更大元素 leetcode-496
給你兩個(gè) 沒(méi)有重復(fù)元素 的數(shù)組 nums1 和 nums2 ,其中nums1 是 nums2 的子集。
請(qǐng)你找出 nums1 中每個(gè)元素在 nums2 中的下一個(gè)比其大的值。
nums1 中數(shù)字 x 的下一個(gè)更大元素是指 x 在 nums2 中對(duì)應(yīng)位置的右邊的第一個(gè)比 x 大的元素。如果不存在,對(duì)應(yīng)位置輸出 -1 。
示例:
方法一:雙棧(比暴力法好一點(diǎn))
解題思路:
定義兩個(gè)stack, stack1存num2, stack2作為temp存stack1 pop出來(lái)的值默認(rèn)max=-1 top= stack1.pop()
- if top > num => max = top
- top = num => isfound = True
- top < num => 繼續(xù)遍歷
每找到一個(gè)元素的下一個(gè)更大的值之后,需要將temp棧中的元素放回到stack中,以便用于剩下的其他元素尋找下一個(gè)更大的值。
while temp:stack.append(temp.pop())代碼實(shí)戰(zhàn):
class Solution:def nextGreaterElement(self, nums1: List[int], nums2: List[int]) -> List[int]:stack = []result = []# 將nums2元素全部存入stack棧中for i in nums2:stack.append(i)# 遍歷nums1 開(kāi)始尋找下一個(gè)更大的元素for num in nums1:max = -1temp = []isFound = Falsewhile not isFound:top = stack.pop()if top > num:max = topelif top == num:isFound = Truetemp.append(top)result.append(max)while temp:stack.append(temp.pop())return result復(fù)雜度分析:
時(shí)間復(fù)雜度O(MN)
空間復(fù)雜度O(N)
方法二:單調(diào)棧+HashMap
解題思路:
代碼實(shí)戰(zhàn):
class Solution:def nextGreaterElement(self, nums1, nums2):d, stack = {}, []for num2 in nums2:while stack and num2 > stack[-1]:d[stack.pop()] = num2stack.append(num2)return [d.get(j, -1) for j in nums1]復(fù)雜度分析:
時(shí)間復(fù)雜度:O(N + M),分別遍歷數(shù)組 nums1 和數(shù)組 nums2 各一次即可,對(duì)于 nums2 中的每個(gè)元素,進(jìn)棧一次,出棧一次;
空間復(fù)雜度:O(N)。我們?cè)诒闅v nums2 時(shí),需要使用棧,以及哈希映射用來(lái)臨時(shí)存儲(chǔ)答案。
總結(jié)
以上是生活随笔為你收集整理的下一个更大元素 leetcode-496的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 炒黄柏的功效与作用、禁忌和食用方法
- 下一篇: 递归算法(一)递归概念与思路