zoukankan      html  css  js  c++  java
  • 庞果英雄会---寻找直方图中面积最大的矩形---编程挑战

    题目链接:http://hero.pongo.cn/home/index

    这里给出一个线性算法和一个平方算法,第一个算法没有问题,挑战成功。第二个算法测试了很多数据但是失败,有大神路过,恳请点拨。

    #include <iostream>
    using namespace std; 
    int g[500],index[500];
    int max_rect(int x[], int n) 
    {
    	int s = 0, maxsum = 0, i, j, h, area;
    	g[0] = index[0] = 0;
    	for (i = 0; i <= n; i++) {
        	h = i == n ? 0 : x[i];
        	for (j = i; g[s] > h; j = index[s--]) {
          		area = (i - index[s]) * g[s];
          		if (area > maxsum	) {
           	 maxsum = area;
          		}
       		 }
        	if (h > g[s]) {
          	g[++s] = h;
          	index[s] = j;
     		}
    	}
      return maxsum;
    }
    int main()
    {
    	int ia[]={2,1,4,5,1,3,3};
    	cout<<max_rect(ia,7)<<endl;
    	return 0;
    }


    这里说一下第二个算法的思路:

    最近面积的右边界,其高度一定比右边的高度要高,否则不满足最大。找到每一列高度大于其右边高度的直方图,往左寻找每一个可能的

    左边界,计算每一个可能的面积,更新最大。

    有一个小技巧是在最后一个元素后面添加哨兵0,这样就可以处理右边界问题了。

    #include <iostream>
    #include <vector>
    using namespace std;
    vector<int> height;
    int maxsum=0;
    int largestRectangleArea(vector<int> &height)
    {
    	int len=height.size();
    	height.push_back(0);
    	for(int i=0;i<len;i++)
    	{
    		if(height[i]<=height[i+1])continue;
    		int mmin=99999;
    		for(int j=i;j>=0;j--)
    		{
    			mmin=mmin<height[j]?mmin:height[j];
    			int area=mmin*(i-j+1);
    			if(area>maxsum)maxsum=area;
    		}
    	}
    	return maxsum;
    }
    int main()
    {
    	int ia[]={7,2,1,4,5,1,3,3};
    	for(int i=0;i<8;i++)height.push_back(ia[i]);
    	cout<<largestRectangleArea(height)<<endl;
    	return 0;
    } 



  • 相关阅读:
    input在输入后回车会刷新当前页面解决
    JS生成当前页面URL二维码
    页面点击特效
    Datetime 使用详解
    三元运算符
    获取checkbox所选中的值
    获取select中所选中option值
    ashx
    python flask 如何读取数据库数据并返回到html
    python3.5+installer 将.py 打包成.exe
  • 原文地址:https://www.cnblogs.com/snake-hand/p/3174351.html
Copyright © 2011-2022 走看看