Leetcode.735行星撞击或线上跑点追击问题
作者:互联网
一条直线上有一些点,每个点有不同方向不同大小的速度,可用[][]int{[1, 3], [3, -1], [10, 2]...} 来表示,其中下标0表示点在直线上的位置,下标1表示点的速度大小(正数向右,负数向左)
1、求第一次碰撞发生的时间?
2、如果每两个点撞击后都会消失,求稳定后,直线上都剩下哪几个点?
3、可能每个点都有自重,自重相同的点撞击后两两消失,自重不同的点撞击后,小的会消失,大的会保留,求稳定状态?
最近看到前面这道题,发现leetcode上有个类似的题目,就拿出来做一下。
直接上解法:
我们认为,先撞击的一定是相邻的两个元素,故我们可以想到,先拿一个for循环遍历数组,每次只判断当前点与它的左侧点会不会碰撞。
实现上,我们拿一个栈来存放存活的点,当前点每次与栈顶判断是否碰撞,碰撞则考虑点消除情况;不碰撞则入栈,向后遍历
时间复杂度O(n), 空间复杂度O(n)
func asteroidCollision(asteroids []int) []int {
if len(asteroids) <= 1 {
return asteroids
}
// 使用栈存放碰撞后生存的元素,栈顶即为可能被碰撞的点
var stack []int
var i int // 当前遍历到的元素下标
for i < len(asteroids) {
if l := len(stack); l > 0 {
// 栈顶元素和相邻元素方向相反,则会碰撞
if stack[l-1] > 0 && asteroids[i] < 0 {
// 1、栈顶>i, i消失,啥也不做
if stack[l-1] > -asteroids[i] {
i++
} else if stack[l-1] < -asteroids[i] { // 2、栈顶 < i , 出栈,i需要再次和栈内下一个元素对比,直到消失或存活或栈为空
stack = stack[:l-1]
} else if stack[l-1] == -asteroids[i] { // 3、栈顶==i, 两者都消失,故出栈
stack = stack[:l-1]
i++
}
// 碰完了就结束这次循环
continue
}
}
// 不碰撞 || 栈为空,则入栈
stack = append(stack, asteroids[i])
i++
}
return stack
}
标签:撞击,Leetcode.735,碰撞,asteroids,栈顶,消失,stack,或线 来源: https://blog.csdn.net/TongWaccs/article/details/112627809