当青训营遇上马上掘金。这次是我第一次参加字节跳动的青训营活动,在一个微信公众号中偶然看到了掘金关于这次活动的推送,就想在这个寒假通过这次机会提升自己,尽最大努力结营,但最重要还是在这次活动中学到知识,提升各方面的能力。在刚了解到青训营活动时就看到了青训营 X 码上掘金」主题创作活动入营版,大致看了四个主题,主题4和之前在力扣做的接雨水问题很相似,从刚接触到接雨水到现在差不多有一年的时间,这一年中参加的大大小小的编程比赛中也遇到过这种问题,每次做这种题都会有新的理解和感悟,当时看到这个主题创作活动没太在意,但顺利入营后子,在昨天的班会中了解到结营青豆的情况,今天就立马写了主题四,很顺利,没去看接雨水原题的情况下写了出来,接雨水这种题型有很多种方法,例如动态规划、双指针、单调栈等等,我之前对力扣的各个方法都看了一遍,感觉还是单调栈更容易理解,实用性也很高,这次的主题四同样是用了单调栈的方法,因为遇到一个高柱子,前面的低柱子对后面的柱子就没限制了,所以在遍历的时候维护一个单调递减栈(严格不严格都行),通过目前遍历到的较高柱子、栈顶的柱子和紧接着栈顶的柱子这三个柱子来去确定可以塞的青豆数,最后附上源代码,希望能在这次青训营活动提升自己的代码创作、开发能力和合作能力。
#include<bits/stdc++.h>
using namespace std;
const int N = 1e5+10;
int height[N];
int main() {
int n;
long long res = 0;
scanf("%d",&n);
stack<int> stk;
for(int i=0;i<n;i++){
scanf("%d",&height[i]);
}
for(int i=0;i<n;i++){
while(!stk.empty() && height[i] > height[stk.top()]){
int low = stk.top();
stk.pop();
if(stk.empty()) break;
int left = stk.top();
res += (long long)(min(height[i],height[left]) - height[low]) * (i - left - 1);
}
stk.push(i);
}
cout<<res;
return 0;
}