mirror of
https://github.com/halfrost/LeetCode-Go.git
synced 2025-07-05 00:25:22 +08:00
46 lines
988 B
Go
46 lines
988 B
Go
package leetcode
|
|
|
|
import (
|
|
"sort"
|
|
|
|
"github.com/halfrost/LeetCode-Go/template"
|
|
)
|
|
|
|
func fallingSquares(positions [][]int) []int {
|
|
st, ans, posMap, maxHeight := template.SegmentTree{}, make([]int, 0, len(positions)), discretization(positions), 0
|
|
tmp := make([]int, len(posMap))
|
|
st.Init(tmp, func(i, j int) int {
|
|
return max(i, j)
|
|
})
|
|
for _, p := range positions {
|
|
h := st.QueryLazy(posMap[p[0]], posMap[p[0]+p[1]-1]) + p[1]
|
|
st.UpdateLazy(posMap[p[0]], posMap[p[0]+p[1]-1], h)
|
|
maxHeight = max(maxHeight, h)
|
|
ans = append(ans, maxHeight)
|
|
}
|
|
return ans
|
|
}
|
|
|
|
func discretization(positions [][]int) map[int]int {
|
|
tmpMap, posArray, posMap := map[int]int{}, []int{}, map[int]int{}
|
|
for _, pos := range positions {
|
|
tmpMap[pos[0]]++
|
|
tmpMap[pos[0]+pos[1]-1]++
|
|
}
|
|
for k := range tmpMap {
|
|
posArray = append(posArray, k)
|
|
}
|
|
sort.Ints(posArray)
|
|
for i, pos := range posArray {
|
|
posMap[pos] = i
|
|
}
|
|
return posMap
|
|
}
|
|
|
|
func max(a int, b int) int {
|
|
if a > b {
|
|
return a
|
|
}
|
|
return b
|
|
}
|