-
题目不难,但是想要提高运算效率需要深思熟虑
-
目前的复杂度比较高。
-
#include
using namespace std;
int LargestRectangleInHistogram(int intarr[], int length)
{
int maxt = 0;
for (int i = 0; i < length; i++)
{
if (i == 0)
{
int j;
for (j = 1; j < length; j++)
{
if (intarr[j] < intarr[i])
{
break;
}
}
if (j >= length - 1)
{
j = length - 1;
}
int tempsum = (j - 1) * intarr[i];
if ((tempsum+intarr[i]) > maxt)
{
maxt = tempsum + intarr[i];
}
}
else if (i == length - 1)
{
int j;
for (j = length-2; j >= 0; j–)
{
if (intarr[j] < intarr[i])
{
break;
}
}
if (j < 0)
{
j = 0;
}
int tempsum = (length - 2 -j) * intarr[i];
if ((tempsum+intarr[i]) > maxt)
{
maxt = tempsum + intarr[i];
}
}
else
{
int j;
int tempsum1 = 0;
int tempsum = 0;
for (j = i-1; j>=0; j–)
{
if (intarr[j] < intarr[i])
{
break;
}
}
if (j < 0)
{
j = 0;
}
tempsum1 = ((i-1)-j) * intarr[i];
if (tempsum1 < 0)
{
tempsum1 = 0;
}for (j = i+1; j <length; j++) { if (intarr[j] < intarr[i]) { break; } } if (j >= length - 1) { j = length - 1; } tempsum = (j-(i+1)) * intarr[i]; if (tempsum < 0) { tempsum = 0; } if ((tempsum+tempsum1+intarr[i]) > maxt) { maxt = tempsum + tempsum1+ intarr[i]; } }
}
return maxt;
}
int main()
{
int intarr[6] = { 2,1,5,6,2,3 };
cout << LargestRectangleInHistogram(intarr, 6) << endl;
system(“pause”);
return 0;
}
网上给出的算法。利用局部峰值的办法。来处理的。减少了每个点都要两边循环的计算步骤,加快了运算效率。
int LargestRectangleInHistogramT(int intarr[], int length)
{
int res = 0;
for (int i = 0; i < length; i++)
{
if (i + 1 < length && intarr[i] <= intarr[i + 1])
{
continue;
}
int minh = intarr[i];
for (int j = i; j >= 0; j–)
{
minh = minT(minh, intarr[j]);
int area = (i - j + 1)*minh;
res = maxT(area, res);
}
}
return res;
}