MCPcopy Create free account
hub / github.com/EndlessCheng/codeforces-go / trap

Function trap

leetcode/main.go:233–279  ·  view source on GitHub ↗

LC 42 接雨水

(a []int)

Source from the content-addressed store, hash-verified

231
232// LC 42 接雨水
233func trap(a []int) (ans int) {
234 n := len(a)
235 if n == 0 {
236 return
237 }
238
239 const border = 2e9
240 type pair struct{ v, i int }
241 posL := make([]int, n)
242 stack := []pair{{border, -1}}
243 for i, v := range a {
244 for {
245 if top := stack[len(stack)-1]; top.v >= v {
246 posL[i] = top.i
247 break
248 }
249 stack = stack[:len(stack)-1]
250 }
251 stack = append(stack, pair{v, i})
252 }
253 posR := make([]int, n)
254 stack = []pair{{border, n}}
255 for i := n - 1; i >= 0; i-- {
256 v := a[i]
257 for {
258 if top := stack[len(stack)-1]; top.v >= v {
259 posR[i] = top.i
260 break
261 }
262 stack = stack[:len(stack)-1]
263 }
264 stack = append(stack, pair{v, i})
265 }
266
267 sum := make([]int, n+1)
268 for i, v := range a {
269 sum[i+1] = sum[i] + v
270 }
271 i := 0
272 for ; posR[i] < n; i = posR[i] {
273 ans += (posR[i]-i)*a[i] - sum[posR[i]] + sum[i]
274 }
275 for j := n - 1; posL[j] >= i; j = posL[j] {
276 ans += (j-posL[j])*a[j] - sum[j+1] + sum[posL[j]+1]
277 }
278 return
279}
280
281// LC 47 给定一个可包含重复数字的序列,返回所有不重复的全排列
282func permuteUnique(nums []int) (ans [][]int) {

Callers

nothing calls this directly

Calls

no outgoing calls

Tested by

no test coverage detected