nums1
中數字x
的下乙個更大元素是指x
在nums2
中對應位置右側的第乙個比x
大的元素。
給你兩個沒有重複元素的陣列nums1
和nums2
,下標從0開始計數,其中nums1
是nums2
的子集。
對於每個0 <= i < nums1.length
,找出滿足nums1[i] == nums2[j]
的下標j
,並且在nums2
確定nums2[j]
的 下乙個更大元素 。如果不存在下乙個更大元素,那麼本次查詢的答案是-1
。
返回乙個長度為nums1.length
的陣列ans
作為答案,滿足ans[i]
是如上所述的下乙個更大元素。
案例1:
輸入:nums1 = [4,1,2], nums2 = [1,3,4,2].
輸出:[-1,3,-1]
- 4 ,用加粗斜體標識,nums2 = [1,3,4,2]。不存在下乙個更大元素,所以答案是 -1 。
- 1 ,用加粗斜體標識,nums2 = [1,3,4,2]。下乙個更大元素是 3 。
- 2 ,用加粗斜體標識,nums2 = [1,3,4,2]。不存在下乙個更大元素,所以答案是 -1 。
案例2:
輸入:nums1 = [2,4], nums2 = [1,2,3,4].
輸出:[3,-1]
- 2 ,用加粗斜體標識,nums2 = [1,2,3,4]。下乙個更大元素是 3 。
- 4 ,用加粗斜體標識,nums2 = [1,2,3,4]。不存在下乙個更大元素,所以答案是 -1 。
我們可以暴力地逐個計算 \(\textit_1\)中的每個元素值 \(\textit_1[i]\) 在 \(\textit_2\)中對應位置的右邊的第乙個比 \(\textit_1[i]\) 大的元素值。具體地,我們使用如下方法:
陣列 \(\textit\)即為最終結果。
class solution
int index = j + 1;
while (index < length && nums2[index] <= currnums1)
if (index < length) else
}return ans;
}}
我們可以先預處理 \(\textit_2\),使查詢 \(\textit_1\)中的每個元素在 \(\textit_2n\) 中對應位置的右邊的第乙個更大的元素值時不需要再遍歷 \(\textit_2\)。於是,我們將題目分解為兩個子問題:
我們可以使用單調棧來解決第 \(1\) 個子問題。倒序遍歷 \(\textit_2\),並用單調棧中維護當前位置右邊的更大的元素列表,從棧底到棧頂的元素是單調遞減的。
具體地,每次我們移動到陣列中乙個新的位置 \(i\),就將當前單調棧中所有小於 \(\textit_2[i]\) 的元素彈出單調棧,當前位置右邊的第乙個更大的元素即為棧頂元素,如果棧為空則說明當前位置右邊沒有更大的元素。隨後我們將位置 \(i\) 的元素入棧。
因為題目規定了 \(\textit_2n\)是沒有重複元素的,所以我們可以使用雜湊表來解決第 \(2\) 個子問題,將元素值與其右邊第乙個更大的元素值的對應關係存入雜湊表。
class solution
int index = j + 1;
while (index < length && nums2[index] <= currnums1)
if (index < length) else
}return ans;
}}
Leetcode 496 下乙個更大元素
給定兩個沒有重複元素的陣列 nums1 和 nums2 其中nums1 是 nums2 的子集。找到 nums1 中每個元素在 nums2 中的下乙個比其大的值。nums1 中數字 x 的下乙個更大元素是指 x 在 nums2 中對應位置的右邊的第乙個比 x 大的元素。如果不存在,對應位置輸出 1。...
leetcode 496 下乙個更大元素 I
給定兩個沒有重複元素的陣列nums1和nums2,其中nums1是nums2的子集。找到nums1中每個元素在nums2中的下乙個比其大的值。nums1中數字 x 的下乙個更大元素是指 x 在nums2中對應位置的右邊的第乙個比 x 大的元素。如果不存在,對應位置輸出 1。示例 1 輸入 nums1...
leetcode 496 下乙個更大元素 I
給定兩個沒有重複元素的陣列nums1和nums2,其中nums1是nums2的子集。找到nums1中每個元素在nums2中的下乙個比其大的值。nums1中數字x的下乙個更大元素是指x在nums2中對應位置的右邊的第乙個比x大的元素。如果不存在,對應位置輸出 1。示例 1 輸入 nums1 4,1,2...