1. 程式人生 > 其它 >下一個更大元素 I -- LeetCode -- 10.26

下一個更大元素 I -- LeetCode -- 10.26

下一個更大元素 I

給你兩個沒有重複元素的陣列nums1nums2,其中nums1nums2的子集。

請你找出nums1中每個元素在nums2中的下一個比其大的值。

nums1中數字x的下一個更大元素是指xnums2中對應位置的右邊的第一個比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 。

暴力很簡單,寫個時間複雜度為O(nums1.length + nums2.length)的:

思路:  

  雜湊表 + 單調棧:

  單調棧: 先將nums2第一個數入棧;然後遍歷,如果當前數字比棧頂元素大,說明棧裡面的元素都有下一個更大元素,之後判斷其在不在nums1之中,將答案存入ans陣列,然後彈出。在整個過程中這個棧一直保持單調遞增。

  雜湊表:在上一步中,快速判斷元素在不在nums1中,以及在具體的那個位置時,雜湊表更好使。

class Solution {
public:
    vector<int> nextGreaterElement(vector<int>& nums1, vector<int>& nums2) {
        vector<int> ans(nums1.size());
        map<int, int> m;
        stack<int> s;
        for(int i = 0; i < nums1.size(); i++){
            ans[i] = -1;
            m[nums1[i]] = i;
        }
        for(int i = 0; i < nums2.size(); i++){
            while(!s.empty() && nums2[i] > s.top()){
                int k = s.top();
                if(m.count(k)) ans[m[k]] = nums2[i];
                s.pop();
            }
            s.push(nums2[i]);
        }
        return ans;
    }
};