給定兩個沒有重複元素的陣列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。
注意:
nums1
和nums2
中所有元素是唯一的。
nums1
和nums2
的陣列大小都不超過1000。
classsolution
//接著從下乙個位置遍歷,比較並賦值
for(m = j; m!=sz2 ;++m)
}//右邊沒有更大的數
if(m ==sz2)
res.push_back(-1
); }
return
res;
}private
: vector
res;
};
正如解法一中所體現的,先是找到findnums中數字在nums中的位置,然後往後比較與賦相應值。
使用雜湊map建立nums中數字與位置的對映,可以加速找到findnums中數字在nums中的位置。
classsolution
//尋找右邊更大的數字並賦相應值
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,用法與解法二不同,區別在於相互對映的物件不同。
classsolution
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...