前往
大廳
主題

LeetCode - 496. Next Greater Element I 解題心得

Not In My Back Yard | 2020-11-03 00:00:02 | 巴幣 0 | 人氣 566

題目連結:


題目意譯:
給定你兩個陣列(沒有重複元素)nums1 和 nums2 ,其中 nums1 的元素們為 nums2 的一個子集合。對於 nums1 中的每個元素,找到每個元素對應到的 nums2 中其位置的「下一個較大的數字」。

nums1 中的一個數字之「下一個較大的數字」為該數在 nums2 中第一個、位於該數右方的較大之數字。如果不存在這樣的數字,則定義為 -1 。

注:
nums1 和 nums2 中的元素皆唯一。
nums1 和 nums2 兩者的長度皆不超過 1000。



範例測資:
範例 1:
輸入: nums1 = [4,1,2] 、 nums2 = [1,3,4,2].
輸出: [-1,3,-1]
解釋:
    對於第一個陣列中的數字 4 ,你無法在第二個陣列找到其下一個較大的數字,所以輸出 -1 。
    對於第一個陣列中的數字 1 ,其在第二個陣列中下一個較大的數字為 3 。
    對於第一個陣列中的數字 2 ,該數在第二個陣列中沒有下一個較大的數字,所以輸出 -1。

範例 2:
輸入: nums1 = [2,4] 、 nums2 = [1,2,3,4].
輸出: [3,-1]
解釋:
    對於第一個陣列中的數字 2 ,其在第二個陣列中下一個較大的數字為 3 。
    對於第一個陣列中的數字 4 ,該數在第二個陣列中沒有下一個較大的數字,所以輸出 -1。


解題思維:
用一個堆疊(Stack)保持著元素值遞減的狀態。

我們掃過 nums2 陣列,每遇到一個數字 n 時,就一直持續地判斷其與堆疊頂端之大小關係。如果 n 大於堆疊頂端,則將頂端元素移除,並將移除的該元素「映射」到 n 值,因為此時 n 為該元素的下一個較大的數字;如果堆疊空了或是 n 不大於堆疊頂端元素,則跳離開一直判斷大小的迴圈。離開迴圈後,將 n 放到堆疊頂端。

上面的過程在做的就是保持著堆疊內的元素遞減,因此每當遇到一個新的、更大的值時,對於堆疊內比它小的元素,該值就是下一個較大的數字。

利用上面求得的映射關係,我們掃過 nums1 陣列。每遇到一個數字就去找它有沒有對應的 n 值。如果有,則 n 值就是所求;如果沒有則代表它下一個較大,所以輸出 -1 。




此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。

創作回應

更多創作