記錄一下自己的解題心路歷程吧:
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");
}