下一个更大元素 II
给定一个循环数组 nums
( nums[nums.length - 1]
的下一个元素是 nums[0]
),返回 nums
中每个元素的 下一个更大元素 。
数字 x
的 下一个更大的元素 是按数组遍历顺序,这个数字之后的第一个比它更大的数,这意味着你应该循环地搜索它的下一个更大的数。如果不存在,则输出 -1
。
示例 1:
输入: nums = [1,2,1] 输出: [2,-1,2] 解释: 第一个 1 的下一个更大的数是 2; 数字 2 找不到下一个更大的数; 第二个 1 的下一个最大的数需要循环搜索,结果也是 2。
示例 2:
输入: nums = [1,2,3,4,3] 输出: [2,3,4,-1,4]
思路:
/*
单调栈
定义一个result用来存下标,和一个栈st用来存元素下标,首先栈先存入数组的第一个元素,从数组的第二个元素element开始比较,
if(element<=nums[st.top()]) st.push(i);
else{
while(!st.empty()&&nums[i]>nums[st.top()]){
result[st.top()] = i;
st.pop();
}
st.push(i);
}
对于循环搜索
for(int i = 0;i<nums.size()*2;i++)类似遍历两遍
i= i%nums.size();求模不至于访问数组越界
*/
代码:
class Solution {
public:
vector<int> nextGreaterElements(vector<int>& nums) {
/*
单调栈
定义一个result用来存下标,和一个栈st用来存元素下标,首先栈先存入数组的第一个元素,从数组的第二个元素element开始比较,
if(element<=nums[st.top()]) st.push(i);
else{
while(!st.empty()&&nums[i]>nums[st.top()]){
result[st.top()] = i;
st.pop();
}
st.push(i);
}
对于循环搜索
for(int i = 0;i<nums.size()*2;i++)类似遍历两遍
i= i%nums.size();求模不至于访问数组越界
*/
vector<int>result(nums.size(),-1);
stack<int>st;
st.push(0);
for(int i = 1;i<nums.size()*2;i++)
{
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;
}
};
42. 接雨水
给定 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 个单位的雨水(蓝色部分表示雨水)。
示例 2:
输入:height = [4,2,0,3,2,5] 输出:9
思路:
/*
采用单调栈
定义一个栈 用来存下标,首先先把数组的第一个元素下标存入栈,然后从数组的第二个元素开始遍历
遍历到的元素如果小于栈顶元素,就把该元素的下标存入栈
遍历到的元素如果大于栈顶元素,就把栈顶元素下标取出记录比该元素大的第一个元素的下标,这个过程是持续性的过程。
以上就是单调栈
本题可以找到栈顶元素的比其右边大的元素,即遍历到的元素,左边遍历到的大的元素,即栈顶的下一个元素
*/
代码:
class Solution {
public:
int trap(vector<int>& height) {
/*
采用单调栈
定义一个栈 用来存下标,首先先把数组的第一个元素下标存入栈,然后从数组的第二个元素开始遍历
遍历到的元素如果小于栈顶元素,就把该元素的下标存入栈
遍历到的元素如果大于栈顶元素,就把栈顶元素下标取出记录比该元素大的第一个元素的下标,这个过程是持续性的过程。
以上就是单调栈
本题可以找到栈顶元素的比其右边大的元素,即遍历到的元素,左边遍历到的大的元素,即栈顶的下一个元素
*/
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);
}
else if(height[i]==height[st.top()])
{
st.push(i);
}
else{
while(!st.empty()&&height[i]>height[st.top()])
{
int mid = st.top();
st.pop();
if(!st.empty())
{ int heigh = min(height[i],height[st.top()])-height[mid];
int width = i-st.top()-1;
sum += heigh*width;
}
}
}
st.push(i);
}
return sum;
}
};
还有很多瑕疵,还需继续坚持!