题解 | #愤怒的小鸟#

愤怒的小鸟

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总是超时,牛客网官方能不能修一修,我寻思我的解答过程也没啥问题啊,*。

这题第一次解出来但是超时了,没有用到差分的思想,就是根据单调栈算出左右第一个不大于目标值的元素下标,然后逐个遍历计算,确实很耗时间。

看了解析,妙啊,加上差分,然后兴冲冲使用了差分来算,***还是超时,我不能接受,看有没有大佬看一下了

全部评论

相关推荐

11-18 09:44
Java
小白也想要offer:简历别放洋屁,搞不还还放错了,当然你投外企除外,以上纯属个人观点
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务