题解 | #愤怒的小鸟#

愤怒的小鸟

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

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

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

全部评论

相关推荐

在评审的大师兄很完美:像这种一般就是部门不匹配 转移至其他部门然后挂掉 我就是这样被挂了
点赞 评论 收藏
分享
球球别再泡了:坏,我单9要了14
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务