
g0001_0100.s0084_largest_rectangle_in_histogram.Solution.swift Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of leetcode-in-all Show documentation
Show all versions of leetcode-in-all Show documentation
104 LeetCode algorithm problem solutions
The newest version!
// #Hard #Top_100_Liked_Questions #Top_Interview_Questions #Array #Stack #Monotonic_Stack
// #Big_O_Time_O(n_log_n)_Space_O(log_n) #2024_06_25_Time_288_ms_(95.83%)_Space_19.9_MB_(54.17%)
class Solution {
func largestRectangleArea(_ heights: [Int]) -> Int {
return largestArea(heights, 0, heights.count)
}
private func largestArea(_ a: [Int], _ start: Int, _ limit: Int) -> Int {
if a.isEmpty {
return 0
}
if start == limit {
return 0
}
if limit - start == 1 {
return a[start]
}
if limit - start == 2 {
let maxOfTwoBars = max(a[start], a[start + 1])
let areaFromTwo = min(a[start], a[start + 1]) * 2
return max(maxOfTwoBars, areaFromTwo)
}
if checkIfSorted(a, start, limit) {
var maxWhenSorted = 0
for i in start.. maxWhenSorted {
maxWhenSorted = a[i] * (limit - i)
}
}
return maxWhenSorted
} else {
let minInd = findMinInArray(a, start, limit)
return maxOfThreeNums(
largestArea(a, start, minInd),
a[minInd] * (limit - start),
largestArea(a, minInd + 1, limit)
)
}
}
private func findMinInArray(_ a: [Int], _ start: Int, _ limit: Int) -> Int {
var min = Int.max
var minIndex = -1
for index in start.. Bool {
for i in (start + 1).. Int {
return max(max(a, b), c)
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy