接雨水和每日温度

								**接雨水**

给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。接雨水和每日温度_第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;
}

思路:
单调栈,单调栈存储的是下标,从栈底到栈顶的下标对应的数组中的元素递减

你可能感兴趣的:(算法,单调栈)