美文网首页
LeetCode 84. Largest Rectangle i

LeetCode 84. Largest Rectangle i

作者: 云胡同学 | 来源:发表于2018-08-29 08:51 被阅读0次

题目描述

Given n non-negative integers representing the histogram's bar height where the width of each bar is 1, find the area of largest rectangle in the histogram.

Above is a histogram where width of each bar is 1, given height = [2,1,5,6,2,3].

The largest rectangle is shown in the shaded area, which has area = 10 unit.

For example,
Given heights = [2,1,5,6,2,3],
return 10.

思路

n个非负整数表示高,宽度为1,求最大的长方形面积。

  1. 对于每一个bar,去找右侧若干个包括自身最大的。
    从左到右遍历,左边比右边大时停止,计算。

  2. 对每一个bar去找从这个bar位置往左和往右第一个小于此bar的索引,记ln为左边索引,rn为右边索引,最后结果是
    (rn - ln - 1) * height[bar]。

代码

class Solution {
public:
    int largestRectangleArea(vector<int>& heights) {
        int i, j;
        int max, value = 0;
        for (i = 0; i < heights.size() - 1; i++)
        {
            for (j = i + 1; j < heights.size(); j++)
            {
                if (heights[i] <= heights[j])
                {
                    if (j == heights.size() - 1)
                    {
                        max = (j - i + 1) * heights[i];
                        if (max > value)
                        {
                            value = max;
                        }
                    }
                }
                else if (heights[i] > heights[j])
                {
                    if (j == i + 1)
                        max = (j - i + 1) * heights[j];
                    else if (j > i + 1)
                        max = (j - i) * heights[i];
                    if (max > value)
                    {
                        value = max;
                    }
                    break;
                }
            }
        }
        return value;
    }
};

时间复杂度

O(n^2)
class Solution {
public:
    int largestRectangleArea(vector<int>& heights) {
        vector<int> s;//记录当前非递减队列的索引
        heights.push_back(0);//增加一个0
        int value = 0;
        int sum = 0;
        int i = 0;
        while (i < heights.size())
        {
            if (s.empty() || heights[i] > heights[s.back()])//s为空或者当前的大于栈顶的
            {
                s.push_back(i);
                i++;
            }
            else//当前的小于栈顶的
            {
                int t = s.back();//栈顶的索引
                s.pop_back();
                if (s.empty())//s为空
                {
                    value = heights[t] * i;
                }
                else
                    value = heights[t] * (i - s.back() - 1);
                    //i是当前bar往右数的第一个小于当前bar的索引
                    //s.back()是往左数的第一个小于bar的索引
                if (value > sum)
                    sum = value;
            }
        }
        return sum;
    }
};

相关文章

网友评论

      本文标题:LeetCode 84. Largest Rectangle i

      本文链接:https://www.haomeiwen.com/subject/ckfhwftx.html