LeetCode 0084
About 2 min
0084. Largest Rectangle in Histogram
- Thẻ: Ngăn xếp, Mảng, Ngăn xếp đơn điệu
- Độ khó: Khó
Tóm tắt đề bài
Cho một mảng số nguyên không âm heights
, heights[i]
được sử dụng để biểu thị chiều cao của cột tương ứng trong biểu đồ cột. Mỗi cột kề nhau và có chiều rộng là 1.
Yêu cầu: Tính toán diện tích của hình chữ nhật lớn nhất mà có thể được hình thành từ các cột trong biểu đồ.
Ý tưởng giải quyết
Có một số cách tiếp cận để giải quyết bài toán này. Dưới đây là một cách tiếp cận sử dụng ngăn xếp đơn điệu.
- Thêm một phần tử
0
vào cuối mảngheights
để đảm bảo rằng tất cả các cột đều được xem xét. - Khởi tạo biến
ans
để lưu kết quả, và một ngăn xếp rỗngstack
. - Duyệt qua từng cột trong mảng
heights
:- Nếu ngăn xếp không rỗng và chiều cao của cột hiện tại nhỏ hơn hoặc bằng chiều cao của cột đỉnh ngăn xếp, thực hiện các bước sau:
- Lấy phần tử đỉnh ngăn xếp ra khỏi ngăn xếp, gán cho biến
cur
. - Tính toán chỉ số
left
vàright
của hình chữ nhật lớn nhất có thể được tạo thành từ cột hiện tại và cột đỉnh ngăn xếp. - Tính diện tích của hình chữ nhật và so sánh với
ans
, lưu giá trị lớn nhất.
- Lấy phần tử đỉnh ngăn xếp ra khỏi ngăn xếp, gán cho biến
- Đẩy chỉ số của cột hiện tại vào ngăn xếp.
- Nếu ngăn xếp không rỗng và chiều cao của cột hiện tại nhỏ hơn hoặc bằng chiều cao của cột đỉnh ngăn xếp, thực hiện các bước sau:
- Trả về kết quả
ans
.
Code
class Solution:
def largestRectangleArea(self, heights: List[int]) -> int:
heights.append(0)
ans = 0
stack = []
for i in range(len(heights)):
while stack and heights[stack[-1]] >= heights[i]:
cur = stack.pop(-1)
left = stack[-1] + 1 if stack else 0
right = i - 1
ans = max(ans, (right - left + 1) * heights[cur])
stack.append(i)
return ans
Độ phức tạp
- Độ phức tạp thời gian: .
- Độ phức tạp không gian: .