Leetcode 496 下乙個更大元素 I

2021-09-25 00:21:12 字數 2826 閱讀 6540

給定兩個沒有重複元素的陣列nums1nums2,其中nums1nums2的子集。找到nums1中每個元素在nums2中的下乙個比其大的值。

nums1中數字x的下乙個更大元素是指xnums2中對應位置的右邊的第乙個比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。

注意:

nums1nums2中所有元素是唯一的。

nums1nums2的陣列大小都不超過1000。

class

solution

//接著從下乙個位置遍歷,比較並賦值

for(m = j; m!=sz2 ;++m)

}//右邊沒有更大的數

if(m ==sz2)

res.push_back(-1

); }

return

res;

}private

: vector

res;

};

正如解法一中所體現的,先是找到findnums中數字在nums中的位置,然後往後比較與賦相應值。

使用雜湊map建立nums中數字與位置的對映,可以加速找到findnums中數字在nums中的位置。

class

solution

//尋找右邊更大的數字並賦相應值

for (int i = 0; i < sz1; ++i) }}

return

res;

}private

:

int sz1 =findnums.size();

int sz2 =nums.size();

vector

res(sz1);

unordered_map

m;};

解題思路:

理解一:這道題要解決的問題比較簡單。一,找到findnums中的數字在nums中的位置;二,尋找右邊第乙個更大的數字。

理解二(解法三):一,先找出在muns中每乙個元素的右邊更大的數字;二,判斷findnums中的數字是否在nums中,然後取得相應的右邊第乙個更大的數字或賦值-1。思路的改變,帶來解法的改變。

要點:如何利用已有的資料結構,快速解決這兩個問題?

(1)先找出在muns中每乙個元素的右邊更大的數字:雜湊表 和 棧

#生長點#

---為什麼用棧來做比較更快?或者為什麼這裡可以用上棧結構?

舉個例子:13

8 246

9用棧比較時:

1)1入棧,接著掃瞄到3,因為3比1大,所以1——>3

,2)然後1出棧,3進棧,接著掃瞄到8,因為8比3大,所以3——>8

3)然後3出棧,8進棧,接著掃瞄到2,2不大於8,2進棧,2成為新的棧頂元素

4)接著掃瞄到4,因為4比2大,所以2——>4

,然後2出棧,此時棧頂元素為8,因4不大於8,4進棧,繼續掃瞄

5)接著掃瞄到6,因為6比4大,所以4——>6

,然後4出棧,此時棧頂元素為8,因6不大於8,6進棧,繼續掃瞄

6)接著掃瞄到9,因為9比6大,所以6——>9,然後6出棧,此時棧頂元素為8,因9比8大,8——>9

,然後8出棧,此時棧空

7)9進棧,棧只有乙個元素,後面沒有更大的元素了。

注:棧的特點體現在尋找 數字8 的右邊第乙個更大的 數字9 上面。

(2),判斷findnums中的數字是否在nums中:雜湊表的find()或count()函式,時間複雜度為o(1)。

注意:這裡也用了雜湊map,用法與解法二不同,區別在於相互對映的物件不同。

class

solution

st.push(num);

}for (int

num : findnums)

return

res;

}private

: stack

st;//

注:棧可以用vector來模擬實現

unordered_mapm;

vector

res;

};

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