给定一个整数数组 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] 中情况下,左星和右星永远不会发生碰撞,直线型,非环形。
标签:剩余,right,star,asteroids,碰撞,行星,left From: https://www.cnblogs.com/wujf-myblog/p/17171592.html