496. 下一个更大元素 I
题目链接:496. 下一个更大元素 I
方法一:模拟 + 哈希表
解题思路
通过哈希表存储,\(nums\) 数组中元素对应的坐标,元素->坐标。
然后模拟查找过程。
代码
class Solution {
public:
    vector<int> nextGreaterElement(vector<int>& nums1, vector<int>& nums2) {
        unordered_map<int, int> index;
        int n1 = nums1.size(), n2 = nums2.size();
        for (int i = 0; i < n2; i ++ ) index[nums2[i]] = i;
        vector<int> ans;
        for (int i = 0; i < n1; i ++ ) {
            int x = nums1[i];
            int x_index = index[x];
            int j; bool flag = false;
            for (j = x_index + 1; j < n2; j ++ ){
                if (nums2[j] > x) {
                    flag = true;
                    break;
                }
            }
            if (flag) ans.emplace_back(nums2[j]);
            else ans.emplace_back(-1);
        }
        return ans;
    }
};
复杂度分析
时间复杂度:\(O(n1 * n2)\),\(n1\) 和 \(n2\) 分别为 \(nums1\) 和 \(nums2\) 数组的长度;
空间复杂度:\(O(n2)\)。
方法二:单调栈
解题思路
单调栈解决 Next Greater Number 一类问题
代码
class Solution {
public:
    vector<int> nextGreaterElement(vector<int>& nums1, vector<int>& nums2) {
        int index[10001]; // index[i],表示数字i,在nums2数组中下一个更大数字的下标
        vector<int> ans;
        stack<int> stk; // 存放下标
        for (int i = nums2.size() - 1; i >= 0; i -- ) {
            while (!stk.empty() && nums2[stk.top()] <= nums2[i]) stk.pop();
            index[nums2[i]] = stk.empty() ? -1 : stk.top();
            stk.push(i);
        }
        for (int i = 0; i < nums1.size(); i ++ ){
            if (index[nums1[i]] == -1) ans.emplace_back(-1);
            else ans.emplace_back(nums2[index[nums1[i]]]);
        }
        return ans;
    }
};
复杂度分析
时间复杂度:\(O(n1 + n2)\),\(n1\) 和 \(n2\) 分别为 \(nums1\) 和 \(nums2\) 数组的长度;
空间复杂度:\(O(n)\),\(n\) 为 \(index\) 数组长度。
 
                    
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号