代码随想录算法训练营第五十九天 |503. 下一个更大元素 II、42. 接雨水

62 阅读1分钟

代码随想录算法训练营第五十九天 |503. 下一个更大元素 II、42. 接雨水

503. 下一个更大元素 II

题目链接:503. 下一个更大元素 II

  • 暴力法
  • 模拟数组出线两遍
  •  class Solution {
     public:
         vector<int> nextGreaterElements(vector<int>& nums) {
             int n = nums.size();
             vector<int> res(n);
             stack<int> s;
             // 数组长度加倍模拟环形数组
             for (int i = 2 * n - 1; i >= 0; i--) {
                 // 索引 i 要求模,其他的和模板一样
                 while (!s.empty() && s.top() <= nums[i % n]) {
                     s.pop();
                 }
                 res[i % n] = s.empty() ? -1 : s.top();
                 s.push(nums[i % n]);
             }
             return res;
         }
     };
    

42. 接雨水

题目链接:42. 接雨水

  • 动态规划简单
  • 递增栈是从栈头到栈底递增
  • 栈顶作为底,栈顶后一个元素作为左边界,当前元素作为右边界
  •   if (height.size() == 0) {
                 return 0;
             }
             int n = height.size();
             int res = 0;
             // 数组充当备忘录
             vector<int> l_max(n);
             vector<int> r_max(n);
             // 初始化 base case
             l_max[0] = height[0];
             r_max[n - 1] = height[n - 1];
             // 从左向右计算 l_max
             for (int i = 1; i < n; i++)
                 l_max[i] = max(height[i], l_max[i - 1]);
             // 从右向左计算 r_max
             for (int i = n - 2; i >= 0; i--)
                 r_max[i] = max(height[i], r_max[i + 1]);
             // 计算答案
             for (int i = 1; i < n - 1; i++)
                 res += min(l_max[i], r_max[i]) - height[i];
             return res;