LeetCode 84 柱状图中最大矩形 栈 O(N) 和 暴力O(N^2)

栈O(N)解法如下:

int largestRectangleArea(int* heights, int heightsSize){
   int top = 0;
   int max_area = 0;
   int *stack_height = (int *) malloc(sizeof(int) * (heightsSize+2));
   int *stack_index = (int *) malloc(sizeof(int) * (heightsSize+2));
   int i = 0;
   int tmp = 0;
   stack_height[0] = -1;
   stack_index[0] = -1;
   for(i = 0; i < heightsSize; i++){
       if(heights[i] > stack_height[top]){/*压栈*/
           stack_height[top+1] = heights[i];
           stack_index[top+1] = i;
           top++;
       }else if(heights[i] == stack_height[top]){ /*更新栈顶元素*/
           stack_height[top] = heights[i];
           stack_index[top] = i;
       }else{/*出栈*/           
           if(max_area < stack_height[top] *(i - stack_index[top-1] - 1)){
               max_area = stack_height[top] *(i - stack_index[top-1] - 1);
           }
           stack_height[top] = 0;
           stack_index[top--] = 0;
           i--;
       }
   }
   
   tmp = stack_index[top];
   for(; top > 0; top--){
       if(max_area < stack_height[top] *(tmp - stack_index[top-1])){
            max_area = stack_height[top] *(tmp - stack_index[top-1]);
        }
   }

   return max_area;
}

暴力 O(N^2)解法如下:

int largestRectangleArea(int* heights, int heightsSize){
    if(heightsSize <= 0){
        return 0;
    }

    int i = 0, left = 0, right = 0, max_area = 0;
    for(i = 0; i < heightsSize; i++){
        for(left = i-1; left >= 0; left--){
            if(heights[left] < heights[i]){
                break;
            }
        }
         for(right = i+1; right < heightsSize; right++){
            if(heights[right] < heights[i]){
                break;
            }
        }
        if(max_area < heights[i]* (right-left-1)){
            max_area = heights[i]* (right-left-1);
        }        
    }
    return max_area;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值