LeetCode 503 下乙個更大元素 II

2021-10-21 08:36:05 字數 1367 閱讀 7256

給定乙個迴圈陣列(最後乙個元素的下乙個元素是陣列的第乙個元素),輸出每個元素的下乙個更大元素。數字 x 的下乙個更大的元素是按陣列遍歷順序,這個數字之後的第乙個比它更大的數,這意味著你應該迴圈地搜尋它的下乙個更大的數。如果不存在,則輸出 -1。

示例 1:

輸入: [1,2,1]

輸出: [2,-1,2]

解釋: 第乙個 1 的下乙個更大的數是 2;

數字 2 找不到下乙個更大的數; 

第二個 1 的下乙個最大的數需要迴圈搜尋,結果也是 2。

注意: 輸入陣列的長度不會超過 10000。

我們先不考慮最後數字的迴圈搜尋,只考慮當前陣列,當前元素的下乙個更大元素

所以我們可以發現,對於嚴格滿足單調遞減的元素,他們的下乙個更大元素是相同的(如果最後乙個數為8,則單調遞減的序列為 7,3,1,-1,8。

此時9將不會出現在單調遞減序列當中)。我們可以考慮使用單調遞減棧來記錄最大值。即最大值一定在棧頂。

此單調棧的規則滿足:

(1)如果棧為空,則進行入棧。

(2)如果棧不為空:

當前元素比棧頂元素小,則將當前元素入棧。

當前元素比棧頂元素大,則一直彈出棧頂,直到棧頂元素比當前元素大,則再下乙個元素

此時通過依次彈出的棧頂元素的下乙個最大值一定為棧頂元素。

為方便運算,考慮單調棧儲存陣列的下標。

迴圈搜尋:考慮將陣列拉長,即將陣列copy一半接在陣列的後面,當然我們沒有必要再空間上

真的區copy一次陣列,我們考慮每次遍歷的長度為2*n,下標使用i%n 就可以了(其中n為陣列的長度)。

#include #include #include using namespace std;

//單調棧

class solution

//棧不為空,且當前元素大於棧頂元素,彈出棧頂元素

while (!m_stack.empty() && nums[i % n] > nums[m_stack.top()])

//入棧

m_stack.push(i % n);

} mgreater.assign(mgreater.begin(), mgreater.begin() + n);

return mgreater;

}private:

stackm_stack;

};int main() ;

vectorres;

solution* ps = new solution();

res = ps->nextgreaterelements(val);

for (int i = 0; i < res.size(); i++)

return 0;

}

leetcode503 下乙個更大的元素

難度 中等 題目 給定乙個迴圈陣列 最後乙個元素的下乙個元素是陣列的第乙個元素 輸出每個元素的下乙個更大元素。數字 x 的下乙個更大的元素是按陣列遍歷順序,這個數字之後的第乙個比它更大的數,這意味著你應該迴圈地搜尋它的下乙個更大的數。如果不存在,則輸出 1。示例 1 輸入 1,2,1 輸出 2,1,...

LeetCode 503 下乙個更大元素II

給定乙個迴圈陣列 最後乙個元素的下乙個元素是陣列的第乙個元素 輸出每個元素的下乙個更大元素。數字 x 的下乙個更大的元素是按陣列遍歷順序,這個數字之後的第乙個比它更大的數,這意味著你應該迴圈地搜尋它的下乙個更大的數。如果不存在,則輸出 1。示例 1 輸入 1,2,1 輸出 2,1,2 解釋 第乙個 ...

Leetcode 503 下乙個更大元素II

給定乙個迴圈陣列 最後乙個元素的下乙個元素是陣列的第乙個元素 輸出每個元素的下乙個更大元素。數字 x 的下乙個更大的元素是按陣列遍歷順序,這個數字之後的第乙個比它更大的數,這意味著你應該迴圈地搜尋它的下乙個更大的數。如果不存在,則輸出 1。示例 1 輸入 1,2,1 輸出 2,1,2 解釋 第乙個 ...