Описание задачи:
Учитывая высоту массива , где каждый элемент представляет высоту гистограммы, найдите область в основном прямого прямого прямого прямого, который может быть сформирован. /> Примеры < /strong> < /h3>
Ввод: [2,1,5,6,2,2,3] < /code>
Выход: 10 < /code>
invallanation: наибольший прямоугольник (область = 10) формируется в баре [5, 6]
Код: Выделить всё
class Solution:
def largestRectangleArea(self, heights: List[int]) -> int:
ans = 0
def myFunc( idx, myMin, length, heights ):
nonlocal ans
endsHere = myMin * length
ans = max( endsHere, ans )
if idx < len( heights ):
if heights[idx] > myMin: myFunc( idx + 1, heights[idx], 1, heights )
myFunc( idx + 1, min( heights[idx], myMin ), length + 1, heights )
myFunc( 0, float('inf'), 0, heights )
return ans
< /code>
Затем мне удалось найти оптимальное решение онлайн: < /p>
class Solution {
public:
int largestRectangleArea(vector& heights) {
int ans = 0;
stack stack;
for (int i = 0; i heights[i])) {
const int h = heights[stack.top()];
stack.pop();
const int w = stack.empty() ? i : i - stack.top() - 1;
ans = max(ans, h * w);
}
stack.push(i);
}
return ans;
}
};
< /code>
Угадай, что это из -за отсутствия этой интуиции, я не понимаю его описания: < /p>
"Для каждого индекса I храните индекс первой полосы слева и правой, соответственно, что ниже, чем высота [i]. Влево и вправо это короче, чем высота [i]
Подробнее здесь: https://stackoverflow.com/questions/796 ... -histogram