标签:撞击 Leetcode.735 碰撞 asteroids 栈顶 消失 stack 或线
一条直线上有一些点,每个点有不同方向不同大小的速度,可用[][]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
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。