程式碼隨想錄演算法訓練營第五十三天 | 739.每日溫度 496.下一個更大的元素I 503.下一個更大的元素II

深蓝von發表於2024-07-05

739.每日溫度

題目連結 文章講解 影片講解
單調棧適合的場景:求當前元素左面或右面第一個比它大或小的元素

  • 單調棧裡存什麼元素
    只要存下標就可以了,比較元素時可以透過下標取元素
  • 單調棧是單調增還是單調減(從棧頂到棧底)
    使用單調增的單調棧

解題步驟:

  1. 遍歷陣列,當棧空時直接入棧
  2. 如果棧不空比較當前元素與棧頂元素,如果當前元素大於棧頂元素,則記錄距離,並彈出棧頂元素
  3. 迴圈第二步直到棧空或者棧頂元素不小於當前元素,將當前元素入棧
class Solution {
public:
    vector<int> dailyTemperatures(vector<int>& temperatures) {
        stack<int> st;
        vector<int> result(temperatures.size(), 0);

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

            while (!st.empty() && temperatures[i] > temperatures[st.top()]) {
                result[st.top()] = i - st.top();
                st.pop();
            }

            st.push(i);
        }
        return result;      
    }
};

496.下一個更大元素I

題目連結 文章講解 影片講解

思路:建立一個map對映,將nums1中的元素和下標做對映,使得根據元素可以獲得下標

class Solution {
public:
    vector<int> nextGreaterElement(vector<int>& nums1, vector<int>& nums2) {
        stack<int> st;
        vector<int> result(nums1.size(), -1);
        unordered_map<int, int> umap;

        for(int i = 0; i < nums1.size(); ++i) umap[nums1[i]] = i;

        for(int i = 0; i < nums2.size(); ++i) {
            while(!st.empty() && nums2[i] > st.top()) {
                if(umap.find(st.top()) != umap.end())
                    result[umap[st.top()]] = nums2[i];
                st.pop();
            }
            st.push(nums2[i]);
        }
        return result;
    }
};

503.下一個更大的元素II

題目連結 文章講解 影片講解

只需將陣列遍歷兩遍,計算下標時使用i % nums.size()

class Solution {
public:
    vector<int> nextGreaterElements(vector<int>& nums) {
        stack<int> st;
        vector<int> result(nums.size(), -1);

        for(int i = 0; i < 2 * nums.size(); ++i) {
            while(!st.empty() && nums[i % nums.size()] > nums[st.top()]) {
                result[st.top()] = nums[i % nums.size()];
                st.pop();
            }
            st.push(i % nums.size());
        }
        return result;
    }
};

相關文章