题解 | #愤怒的小鸟#
愤怒的小鸟
https://www.nowcoder.com/practice/597c32f0b3cf43beb1d01e7ddd87cc32
package main import "fmt" func main() { // n var n int fmt.Scan(&n) // 高度数组 var h = make([]int, n) for i := 0; i < n; i++ { var temp int fmt.Scan(&temp) h[i] = temp } left := make([]int, n) right := make([]int, n) for i := 0; i < n; i++ { left[i] = -1 right[i] = -1 } stack := make([]int, 10^6) top := 0 for i := 0; i < n; i++ { for top > 0 && h[stack[top-1]] <= h[i] { right[stack[top-1]] = i top-- } stack[top] = i top++ } top = 0 for i := n - 1; i >= 0; i-- { for top > 0 && h[stack[top-1]] <= h[i] { left[stack[top-1]] = i top-- } stack[top] = i top++ } v := make([]int, n+1) for i := 0; i < n; i++ { if left[i] != -1 { v[1]++ v[left[i]+2]-- } if right[i] != -1 { v[right[i]+1]++ } } for i := 1; i <= n; i++ { v[i] += v[i-1] } //输出res for i := 1; i <= n; i++ { fmt.Printf("%d ", v[i]) } }
我只能说,我很生气,为什么golang总是超时,牛客网官方能不能修一修,我寻思我的解答过程也没啥问题啊,*。
这题第一次解出来但是超时了,没有用到差分的思想,就是根据单调栈算出左右第一个不大于目标值的元素下标,然后逐个遍历计算,确实很耗时间。
看了解析,妙啊,加上差分,然后兴冲冲使用了差分来算,***还是超时,我不能接受,看有没有大佬看一下了