LC 42 接雨水
(a []int)
| 231 | |
| 232 | // LC 42 接雨水 |
| 233 | func 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 给定一个可包含重复数字的序列,返回所有不重复的全排列 |
| 282 | func permuteUnique(nums []int) (ans [][]int) { |
nothing calls this directly
no outgoing calls
no test coverage detected