vector的扩充要熟悉
vector<int> numsT(nums.begin(),nums.end());
nums.insert(nums.end(),numsT.begin(),numsT.end());
class Solution {
public:
vector<int> nextGreaterElements(vector<int>& nums) {
stack<int> st;
vector<int> numsT(nums.begin(),nums.end());
nums.insert(nums.end(),numsT.begin(),numsT.end());
vector<int> res(nums.size(),-1);
st.push(0);
int index=1;
while(!st.empty()&&index<nums.size()){
while(index<nums.size()&&nums[index]<=nums[st.top()]){
st.push(index);
index++;
}
while(!st.empty()&&index<nums.size()&&nums[index]>nums[st.top()]){
res[st.top()]=nums[index];
st.pop();
}
st.push(index);
index++;
}
return vector <int>(res.begin(),res.begin()+numsT.size());
}
};
vector.resize()-》
result.resize(nums.size() / 2);
可以模拟走了两遍数组
不知道咋转为单调栈
题解:代码随想录
按照列计算,这样只要计算高度。有多种解法,首先是双指针解法,对于每个位置,遍历最右边和最左边最高高度,找到两者最小值-本列高度,就能得到当前装的雨水高度。更进一步是,每列的左侧最高高度转为左边一列的左侧最高高度和左侧一列的高度最大值,右侧类似,减少重复计算。
maxLeft[i] = max(height[i], maxLeft[i - 1]);
单调栈解法:是按行做
要用单调增的单调栈,如果新加的元素比栈头大,栈头就是底部,栈头左边是最近的比他高的左边柱子。因为我们要求宽度的时候 如果遇到相同高度的柱子,需要使用最右边的柱子来计算宽度,所以相同值要替换下标。栈里保存下表,通过长*宽算雨水体积。
一次wa是因为stack弹出元素后要取栈顶元素之有特判stack是否为空
class Solution {
public:
int trap(vector<int>& height) {
stack <int> st;
st.push(0);
int index=1;
if(height.size()<=2){
return 0;
}
int sum=0;
while(!st.empty()&&index<height.size()){
while(!st.empty()&&index<height.size()&&height[index]<height[st.top()]){
st.push(index);
index++;
}
while(!st.empty()&&index<height.size()&&(height[index]==height[st.top()])){
st.pop();
st.push(index);
index++;
}
while(!st.empty()&&index<height.size()&&height[index]>height[st.top()]){
int mid=st.top();
st.pop();
if(! st.empty()){
int h=min(height[index],height[st.top()])-height[mid];
int w=index-st.top()-1;
sum+=h*w;
}
}
st.push(index);
index++;
}
return sum;
}
};