棧 496 下乙個更大元素

2021-10-18 08:49:20 字數 1839 閱讀 6840

題目:給你兩個沒有重複元素 的陣列 nums1 和 nums2 ,其中nums1 是 nums2 的子集。

請你找出 nums1 中每個元素在 nums2 中的下乙個比其大的值。

nums1 中數字 x 的下乙個更大元素是指 x 在 nums2 中對應位置的右邊的第乙個比 x 大的元素。

如果不存在,對應位置輸出-1 。

輸入: nums1 = [4,1,2], nums2 = [1,3,4,2].

輸出: [-1,3,-1]

解釋:對於 num1 中的數字 4 ,你無法在第二個陣列中找到下乙個更大的數字,因此輸出 -1 。

對於 num1 中的數字 1 ,第二個陣列中數字1右邊的下乙個較大數字是 3 。

對於 num1 中的數字 2 ,第二個陣列中沒有下乙個更大的數字,因此輸出 -1 。

解法一:暴力解法

class

solution

//定義乙個棧,把num2中,從右往左數大於4的全部放入棧中,因為這樣做,棧頂就是離4最近的數

stack

stack=

newstack()

;for

(int j=nums2.length-

1;j>index;j--)}

//如果棧為空,說明沒有大於4的數

if(stack.

isempty()

)else

}//定義乙個陣列,把arraylist中的結果複製到陣列中

int[

] result=

newint

[nums1.length]

;for

(int i=

0;isize()

;i++

)return result;

}}

解法二:單調棧(官方解法):先只遍歷nums2,把所有結果找出放到hashmap中,之後遍歷nums1找對應的結果就好了。

我們可以忽略陣列 nums1,先對將 nums2 中的每乙個元素,求出其下乙個更大的元素。隨後對於將這些答案放入雜湊對映(hashmap)中,再遍歷陣列 nums1,並直接找出答案。對於 nums2,我們可以使用單調棧來解決這個問題。

把第乙個元素 nums2[1] 放入棧,隨後對於第二個元素 nums2[2],如果 nums2[2] > nums2[1],那麼我們就找到了 nums2[1] 的下乙個更大元素 nums2[2],此時就可以把 nums2[1] 出棧並把 nums2[2] 入棧;如果 nums2[2] <= nums2[1],我們就僅把 nums2[2] 入棧。對於第三個元素 nums2[3],此時棧中有若干個元素,那麼所有比 nums2[3] 小的元素都找到了下乙個更大元素(即 nums2[3]),因此可以出棧,在這之後,我們將 nums2[3] 入棧,以此類推。

可以發現,我們維護了乙個單調棧,棧中的元素從棧頂到棧底是單調不降的。當我們遇到乙個新的元素 nums2[i] 時,我們判斷棧頂元素是否小於 nums2[i],如果是,那麼棧頂元素的下乙個更大元素即為 nums2[i],我們將棧頂元素出棧。重複這一操作,直到棧為空或者棧頂元素大於 nums2[i]。此時我們將 nums2[i] 入棧,保持棧的單調性,並對接下來的 nums2[i + 1], nums2[i + 2] … 執行同樣的操作。

class

solution

stack.

push

(nums2[i]);

}//遍歷nums1,以nums1中的值為key的value直接就是答案

for(

int i=

0;i)else

}return result;

}}

496 下乙個更大元素

給定兩個 沒有重複元素 的陣列 nums1 和 nums2 其中nums1 是 nums2 的子集。找到 nums1 中每個元素在nums2 中的下乙個比其大的值。nums1 中數字 x 的下乙個更大元素是指 x 在 nums2 中對應位置的右邊的第乙個比 x 大的元素。如果不存在,對應位置輸出 1...

496 下乙個更大元素

給定兩個沒有重複元素的陣列 nums1 和 nums2 其中nums1 是 nums2 的子集。找到 nums1 中每個元素在 nums2 中的下乙個比其大的值。nums1 中數字 x 的下乙個更大元素是指 x 在 nums2 中對應位置的右邊的第乙個比 x 大的元素。如果不存在,對應位置輸出 1。...

496 下乙個更大元素

給定兩個沒有重複元素的陣列 nums1 和 nums2 其中nums1 是 nums2 的子集。找到 nums1 中每個元素在 nums2 中的下乙個比其大的值。nums1 中數字 x 的下乙個更大元素是指 x 在 nums2 中對應位置的右邊的第乙個比 x 大的元素。如果不存在,對應位置輸出 1。...