All Downloads are FREE. Search and download functionalities are using the official Maven repository.

g0001_0100.s0084_largest_rectangle_in_histogram.solution.go Maven / Gradle / Ivy

package s0084_largest_rectangle_in_histogram

import "math"

// #Hard #Top_100_Liked_Questions #Top_Interview_Questions #Array #Stack #Monotonic_Stack
// #Big_O_Time_O(n_log_n)_Space_O(log_n) #2024_03_15_Time_95_ms_(77.81%)_Space_7.8_MB_(91.91%)

func largestRectangleArea(heights []int) int {
	return largestArea(heights, 0, len(heights))
}

func largestArea(a []int, start, limit int) int {
	if len(a) == 0 {
		return 0
	}
	if start == limit {
		return 0
	}
	if limit-start == 1 {
		return a[start]
	}
	if limit-start == 2 {
		maxOfTwoBars := max(a[start], a[start+1])
		areaFromTwo := min(a[start], a[start+1]) * 2
		return max(maxOfTwoBars, areaFromTwo)
	}
	if checkIfSorted(a, start, limit) {
		maxWhenSorted := 0
		for i := start; i < limit; i++ {
			if a[i]*(limit-i) > maxWhenSorted {
				maxWhenSorted = a[i] * (limit - i)
			}
		}
		return maxWhenSorted
	} else {
		minInd := findMinInArray(a, start, limit)
		return maxOfThreeNums(
			largestArea(a, start, minInd),
			a[minInd]*(limit-start),
			largestArea(a, minInd+1, limit),
		)
	}
}

func findMinInArray(a []int, start, limit int) int {
	min := math.MaxInt32
	minIndex := -1
	for index := start; index < limit; index++ {
		if a[index] < min {
			min = a[index]
			minIndex = index
		}
	}
	return minIndex
}

func checkIfSorted(a []int, start, limit int) bool {
	for i := start + 1; i < limit; i++ {
		if a[i] < a[i-1] {
			return false
		}
	}
	return true
}

func max(x, y int) int {
	if x > y {
		return x
	}
	return y
}

func min(x, y int) int {
	if x < y {
		return x
	}
	return y
}

func maxOfThreeNums(x, y, z int) int {
	return max(max(x, y), z)
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy