**接雨水**
给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。
int trap(int* height, int heightSize){
if(heightSize==0){
return 0;
}
int all=0;//总雨水
int stack[heightSize];//数组模拟栈
int num=0;//栈顶指针
int i;
for(i=0;i<heightSize;i++){
while(num&&height[i]>height[stack[num-1]]){//当栈顶指针大于0,并且入栈元素大于栈顶元素时
int top=stack[--num];//栈顶下标
if(!num){
break;
}
int left=stack[num-1];//栈顶元素的前一个元素
int width=i-left-1;//宽度
int high =fmin(height[i],height[left])-height[top];//高度
all+=width*high;
}
stack[num++]=i;
}
return all;
}
****每日温度****
请根据每日 气温 列表 temperatures ,请计算在每一天需要等几天才会有更高的温度。如果气温在这之后都不会升高,请在该位置用 0 来代替。
int* dailyTemperatures(int* temperatures, int temperaturesSize, int* returnSize){
*returnSize=temperaturesSize;
int* result=malloc(sizeof(int)*temperaturesSize);
memset(result,0,sizeof(int)*temperaturesSize);
int stack[temperaturesSize];//数组模拟栈
int i,num=0;//栈顶指针
for(i=0;i<temperaturesSize;i++){
while(num&&temperatures[i]>temperatures[stack[num-1]]){
result[stack[num-1]]=i-stack[num-1];//当前元素和栈顶元素下标差
num--;//比较栈顶前一个元素
}
stack[num++]=i;
}
return result;
}
思路:
单调栈,单调栈存储的是下标,从栈底到栈顶的下标对应的数组中的元素递减