主页 > 电脑硬件  > 

代码随想录|Day61and62

代码随想录|Day61and62

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录 今日学习目标一、算法题1.下一个更大元素 II2.接雨水3.柱状图中最大的矩形 今日心得学习及参考书籍


今日学习目标

下一个更大元素 II(503) 接雨水(42) 柱状图中最大的矩形(84)

一、算法题 1.下一个更大元素 II

题目: 给定一个循环数组 nums ( nums[nums.length - 1] 的下一个元素是 nums[0] ),返回 nums 中每个元素的 下一个更大元素 。

数字 x 的 下一个更大的元素 是按数组遍历顺序,这个数字之后的第一个比它更大的数,这意味着你应该循环地搜索它的下一个更大的数。如果不存在,则输出 -1 。

示例 1:

输入: nums = [1,2,1] 输出: [2,-1,2] 解释: 第一个 1 的下一个更大的数是 2; 数字 2 找不到下一个更大的数; 第二个 1 的下一个最大的数需要循环搜索,结果也是 2。

代码:

class Solution { public: vector<int> nextGreaterElements(vector<int>& nums) { vector<int> result(nums.size(), -1); if (nums.size() == 0) return result; stack<int> st; st.push(0); for (int i = 1; i < nums.size() * 2; i++) { // 模拟遍历两边nums,注意一下都是用i % nums.size()来操作 if (nums[i % nums.size()] < nums[st.top()]) st.push(i % nums.size()); else if (nums[i % nums.size()] == nums[st.top()]) st.push(i % nums.size()); else { 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; } }; 2.接雨水

题目: 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。

示例 1:

输入:height = [0,1,0,2,1,0,1,3,2,1,2,1] 输出:6 解释:上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下,可以接 6 个单位的雨水(蓝色部分表示雨水)。

代码:

class Solution { public: int trap(vector<int>& height) { if (height.size() <= 2) return 0; // 可以不加 stack<int> st; // 存着下标,计算的时候用下标对应的柱子高度 st.push(0); int sum = 0; for (int i = 1; i < height.size(); i++) { if (height[i] < height[st.top()]) { // 情况一 st.push(i); } if (height[i] == height[st.top()]) { // 情况二 st.pop(); // 其实这一句可以不加,效果是一样的,但处理相同的情况的思路却变了。 st.push(i); } else { // 情况三 while (!st.empty() && height[i] > height[st.top()]) { // 注意这里是while int mid = st.top(); st.pop(); if (!st.empty()) { int h = min(height[st.top()], height[i]) - height[mid]; int w = i - st.top() - 1; // 注意减一,只求中间宽度 sum += h * w; } } st.push(i); } } return sum; } }; 3.柱状图中最大的矩形

题目: 给定 n 个非负整数,用来表示柱状图中各个柱子的高度。每个柱子彼此相邻,且宽度为 1 。

求在该柱状图中,能够勾勒出来的矩形的最大面积。

示例 1:

输入:heights = [2,1,5,6,2,3] 输出:10 解释:最大的矩形为图中红色区域,面积为 10

代码:

class Solution { public: int largestRectangleArea(vector<int>& heights) { int result = 0; stack<int> st; heights.insert(heights.begin(), 0); // 数组头部加入元素0 heights.push_back(0); // 数组尾部加入元素0 st.push(0); // 第一个元素已经入栈,从下标1开始 for (int i = 1; i < heights.size(); i++) { if (heights[i] > heights[st.top()]) { // 情况一 st.push(i); } else if (heights[i] == heights[st.top()]) { // 情况二 st.pop(); // 这个可以加,可以不加,效果一样,思路不同 st.push(i); } else { // 情况三 while (!st.empty() && heights[i] < heights[st.top()]) { // 注意是while int mid = st.top(); st.pop(); if (!st.empty()) { int left = st.top(); int right = i; int w = right - left - 1; int h = heights[mid]; result = max(result, w * h); } } st.push(i); } } return result; } };
今日心得

比想象中的难。

学习及参考书籍

代码随想录

标签:

代码随想录|Day61and62由讯客互联电脑硬件栏目发布,感谢您对讯客互联的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人网站或者朋友圈,但转载请说明文章出处“代码随想录|Day61and62