📣 独立日限时特惠: VIP通行证立减$68
查看: 4624| 回复: 3
跳转到指定楼层
上一主题 下一主题
收起左侧

Google : 求柱状统计图里最大矩形面积

全局:

注册一亩三分地论坛,查看更多干货!

您需要 登录 才可以下载或查看附件。没有帐号?注册账号

x
就是给一个柱状统计图,各个小矩形宽度相等,高度不一,每一个矩形是由几个相邻柱状条条组成,矩形的高度为最短的那根条条,求所有组合中最大的矩形面积,假设柱状统计图是放在数组里的,数组记录的是每个条条的高度。

有O(n^2), O(nlogn)和O(n)三种解法,很好的一题

上一篇:计算括号排列种数
下一篇:找零钱算法
🔗
darksteel 2011-6-6 12:08:04 | 只看该作者
全局:
见过这题,可以把高度依次压入栈中,如果当前高度小于栈顶元素,就弹出栈顶元素直到栈顶小于等于当前高度,这一过程中不断更新最大值,是可以做到O(n)的。
回复

使用道具 举报

🔗
 楼主| wwwyhx 2011-6-7 12:54:47 | 只看该作者
全局:
见过这题,可以把高度依次压入栈中,如果当前高度小于栈顶元素,就弹出栈顶元素直到栈顶小于等于当前高度,这一过程中不断更新最大值,是可以做到O(n)的。
darksteel 发表于 2011-6-6 12:08



    我觉得你已经成仙了,做了多少题老实交代
回复

使用道具 举报

🔗
 楼主| wwwyhx 2011-6-8 20:37:54 | 只看该作者
全局:
代码应该好理解:

//O(nlog(n)) solution is like quick sort ,
//O(n) solution is like to calculate the smaller closest previous index for each element

int CalcHistogram1(int a[], int n)
{
        assert(NULL != a);
        if(0 == n) return 0;

        assert(n > 0);

        //Find the smallest element
        int nSmallest = 0;
        for (int i = 0; i < n; i++)
        {
                assert(a[i] >= 0);
                nSmallest = a[nSmallest] < a[i] ? nSmallest : i;
        }

        int nRet = a[nSmallest] * n;
        int nLft = CalcHistogram1(a, nSmallest);
        int nRgt = CalcHistogram1(a+nSmallest+1, n-nSmallest-1);

        nRet = nRet > nLft ? nRet : nLft;
        nRet = nRet > nRgt ? nRet : nRgt;

        return nRet;
}

int CalcHistogram2(int a[], int n)
{
        assert(NULL != a);
        assert(n > 0);

        int nRet = 0;
        stack<int> stk;
        stk.push(0);

        for (int i = 1; i < n; i++)
        {
                assert(a[i] >= 0);
                if (a[i] >= stk.top())
                {
                        stk.push(a[i]);
                        continue;
                }

                while (!stk.empty() && stk.top() > a[i])
                {
                        int nTop = stk.top();
                        stk.pop();

                        nRet = nRet > (i-nTop)*a[nTop] ? nRet : (i-nTop)*a[nTop];
                }
        }

        int nEnd = stk.top()+1;
        while (!stk.empty())
        {
                int nTop = stk.top();
                stk.pop();

                nRet = nRet > (nEnd-nTop)*a[nTop] ? nRet : (nEnd-nTop)*a[nTop];
        }

        return nRet;
}
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册账号
隐私提醒:
  • ☑ 禁止发布广告,拉群,贴个人联系方式:找人请去🔗同学同事飞友,拉群请去🔗拉群结伴,广告请去🔗跳蚤市场,和 🔗租房广告|找室友
  • ☑ 论坛内容在发帖 30 分钟内可以编辑,过后则不能删帖。为防止被骚扰甚至人肉,不要公开留微信等联系方式,如有需求请以论坛私信方式发送。
  • ☑ 干货版块可免费使用 🔗超级匿名:面经(美国面经、中国面经、数科面经、PM面经),抖包袱(美国、中国)和录取汇报、定位选校版
  • ☑ 查阅全站 🔗各种匿名方法

本版积分规则

>
快速回复 返回顶部 返回列表