力扣簡單專欄 496 下乙個更大元素 I

2021-10-22 03:11:49 字數 1782 閱讀 1024

給你兩個 沒有重複元素 的陣列 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 。

1 <= nums1.length <= nums2.length <= 1000

0 <= nums1[i], nums2[i] <= 104

nums1和nums2中所有整數 互不相同

nums1 中的所有整數同樣出現在 nums2 中

思路:暴力解法很容易想到,這裡不做贅述。假設下乙個更大元素為x,我們要思考的是如何在o(n)的時間內掃瞄一遍nums1陣列就能得到每個元素對應的x,顯然我們需要做乙個預處理,用乙個對映集map將所有x儲存下來,在掃瞄nums1時得到每個元素對應的x。如何得到x?我們需要乙個線性結構來判定並儲存它,棧和佇列是常用的線性結構。根據題目要求,我們需要的線性結構最好每次都能在一端a中取得元素中的最大值,並且最大值更新時,能在a處彈出原來的最大值,然後在a插入最大值。如果按照佇列的先進先出的原則,那麼每次插入更大的數,最大值雖然能在隊尾取取到,但是出隊元素是最小值。如果每次插入更小的數,最大值雖然能在隊頭取到,但是插入元素是最小值。由此可見,同一屬性的元素的操作都能在一端進行的結構只有棧。確定了資料結構,題目就不難解決了。首先掃瞄nums2,若棧空,入棧當前元素e。若棧不空,則看棧頂s是否小於e。如果是,則將所有小於e的棧頂彈出,並且使map[s]=e,這樣就確定了s對應的x為e,然**棧e,e就成了棧頂且是當前棧中的最大值。需要注意的是,有的棧頂s沒有對應的x,那麼它就會滯留在棧中。所以在掃瞄完nums2後,我們需要將棧中剩餘元素s出棧,並使map[s]=-1。至此,預處理完成,只需掃瞄一遍nums1並將元素對應的x加入結果陣列中即可。

偽**:

class

solution

stk.

push

(e);

}while

(!stk.

empty()

) 掃瞄nums1

return ans;

}}

class

solution

stk.

push

(nums2[i]);

}while

(!stk.

empty()

)for

(int i=

0;isize()

;i++

) ans.

push_back

(mp[nums1[i]])

;return ans;}}

;

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。...