行星碰撞取剩余元素

给定一个整数数组 asteroids,表示在同一行的行星。

对于数组中的每一个元素,其绝对值表示行星的大小,正负表示行星的移动方向(正表示向右移动,负表示向左移动)。每一颗行星以相同的速度移动。

找出碰撞后剩下的所有行星。碰撞规则:两个行星相互碰撞,较小的行星会爆炸。如果两颗行星大小相同,则两颗行星都会爆炸。两颗移动方向相同的行星,永远不会发生碰撞。

示例一:

输入:asteroids = [5,10,-5]

输出:[5,10]

解释:10 和 -5 碰撞后只剩下 10 。 5 和 10 永远不会发生碰撞

 

示例二:

输入:asteroids = [8,-8]

输出 :[]

解释:8 和 -8 碰撞后,两者都发生爆炸。

 

题解:

function asteroidCollision($asteroids) {
$length = count($asteroids);
if ($length === 0) {
return [];
}
if ($length === 1) {
return $asteroids;
}
$stack = [];
array_push($stack, $asteroids[0]);
for ($i = 1; $i < $length; $i++) {
$left_star = array_pop($stack) ?? 0;
$right_star = $asteroids[$i];
     //右星和左星方向不一致才会发生碰撞,是直线型,但不是环形
while($left_star > 0 && $right_star < 0){
if (abs($right_star) > $left_star) { // 右星大,继续取出左星
$left_star = array_pop($stack) ?? 0;
} elseif (abs($right_star) < $left_star) { // 右星小,右星碰撞消失归零
$right_star = 0;
} else { // 左右星一致,双星归零
$right_star = 0;
$left_star = 0;
}
}

if ($left_star !== 0) {
array_push($stack, $left_star);
}
if ($right_star !== 0) {
array_push($stack, $right_star);
}
}
return $stack;
}

特例:

[-2,-1,1,2]  中情况下,左星和右星永远不会发生碰撞,直线型,非环形。

 

posted @   龙卷风之殇  阅读(18)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现
历史上的今天:
2022-03-02 安装pyecharts报错--cannot import name 'Scatter' from 'pyecharts
点击右上角即可分享
微信分享提示