代码随想录算法训练营第五十九天 |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;