记录一下自己的解题心路历程吧:
1. 遍历所有的数值,然后比较每个点的flag值的大小,运行时间肯定超了;
2. 后来,一想到只要找到比当前点值大的点就达到遍历的目的,精简后还是时间超了;
3. 针对每个点从距离最远的点开始遍历直到找到大于该点的值,时间还是超了;
4. 然后借鉴了Gitbooks上一个小伙伴的解题思路 https://siddontang.gitbooks.io/leetcode-solution/content/array/largest_rectangle_in_histogram.html ,但是他的题目是矩形和本题的线的求解不同,但是他使用的队列的思路非常好,只可惜不符合本题;
5. 最后,还是美其名曰的借鉴了LeetCode提供的答案:
从两侧开始找最大的矩形,有且仅有下一个矩形的高度增加的面积大于宽度减小的面积,下一个矩形才有可能面积大于两侧最宽的矩形;因此从两侧依次往里遍历,在宽度减小的情况下,使下一个矩形的高度大于之前的矩形高度;其实是一个控制变量的思路,先找到宽度最大的矩形,然后变化高度,保证宽度减小面积也能增大。
具体代码如下:
#include
#include
#include
#include
using namespace std;
class Solution {
public:
int maxArea(vector
& height) { //考虑两边最有可能成为最大值的情况:边的长度增加的好处大于宽度缩小的好处; //对应的情况就是关键边边长,宽度减小。 int l = 0; int r = height.size() - 1; int sum = 0; while (l
nums1(&a[0], &a[len1]); double result; result = sol.maxArea(nums1); cout << result << endl; system("pause"); }