其他分享
首页 > 其他分享> > Leetcode.735行星撞击或线上跑点追击问题

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