這道題題目都讀了半天才明白,翻譯的實在有點...
暴力:遍歷nums1的元素,每一輪遍歷,在nums2中找到相同值的那個元素在nums2中的下標,從該下標開始遍歷,遍歷nums2陣列,找到第乙個比該元素值大的元素,加入到結果陣列中,如果沒有找到就加入-1。
單調棧法:單調棧的原理參考: 開始時不需要管nums1,只需要對nums2構造單調棧,同時還要維護乙個map。
單調棧在本題的規則:
① 棧中沒有元素時可直接加入。
② 棧中有元素時,將加入的元素同棧頂元素比較
(1)如果比棧頂元素小,則入棧;
(2)如果比棧頂元素大,則將棧頂pop,同時建立棧頂元素與欲加入元素的map對映:map[stack[top]] = nums2[i]; ; 同時要注意如果棧頂pop後的新棧頂依然比欲加入元素小,則繼續建立map對映:map[stack[top]]=nums2[i];,直到新的棧頂元素比欲加入的元素值大為止;
(3)不可能出現要加入的值和元素值相同的情況所以不考慮。
在對nums2所有元素構造完單調棧和map對映後,要注意要判斷最後棧是否為空,如果棧不為空,那麼還要將剩下的元素與-1分別對映,表示其後已經沒有比他更大的元素了。
明顯map對映構造的就是nums2陣列中每個元素對應的 "之後比其大的第乙個元素值",如果不存在就是與-1對映。
map對映建立完後,對nums1陣列遍歷,利用剛才的對映關係就可以輕鬆拿到值了。
暴力:
vectornextgreaterelement(vector& nums1, vector& nums2)
} for (j = n2_pointer; j < nums2.size(); j++)
if (j == nums2.size() - 1)
} }return ans;
}
單調棧:
vectornextgreaterelement(vector& nums1, vector& nums2)
top++;
stack[top] = nums2[i];
} else if (nums2[i] < stack[top])
top++;
stack[top] = nums2[i];
} }while (top != -1)
for (int k = 0; k < nums1.size(); k++)
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...