735. Столкновение астероидов (Medium) (https://leetcode.com/problems/asteroid-collision/)

Нам дан массив astероids, содержащий целые числа, представляющие астероиды в ряд. Индексы астероида в массиве представляют их относительное положение в пространстве. Для каждого астероида абсолютное значение представляет его размер, а знак — направление (положительное означает вправо, отрицательное — влево). Все астероиды двигаются с одинаковой скоростью. Определите состояние астероидов после всех столкновений. Если два астероида встречаются, меньший взрывается. Если оба одинакового размера, взрываются оба. Два астероида, движущихся в одном направлении, никогда не встретятся. Ограничения: - 2 <= asteroids.length <= 10^4 - -1000 <= asteroids[i] <= 1000 - asteroids[i] != 0

function asteroidCollision(asteroids: number[]): number[] {
  const stack: number[] = []
 
  for (let i = 0; i < asteroids.length; i++) {
    const curr = asteroids[i]
    if (stack.length === 0 || (stack.at(-1)! > 0 && curr > 0)) {
      stack.push(curr)
      continue
    }
 
    if (stack.at(-1)! < 0 && curr > 0) {
      stack.push(curr)
      continue
    }
 
    let currAlive = true
    while (stack.at(-1)! > 0 && curr < 0) {
      if (Math.abs(curr) > Math.abs(stack.at(-1)!)) {
        stack.pop()
      } else if (Math.abs(curr) < Math.abs(stack.at(-1)!)) {
        currAlive = false
        break
      } else {
        currAlive = false
        stack.pop()
        break
      }
    }
 
    if (currAlive) {
      stack.push(curr)
    }
  }
 
  return stack
}
 
// Локальная проверка:
console.log(asteroidCollision([10, -2]))
console.log(asteroidCollision([5, 10, -5]))
console.log(asteroidCollision([8, -8]))
console.log(asteroidCollision([10, 2, -5]))
console.log(asteroidCollision([3, 5, -6, 2, -1, 4]))
Пример 1:
 
    Вход: asteroids = [5,10,-5]
    Выход: [5,10]
    Объяснение: 10 и -5 сталкиваются, в результате остаётся 10. 5 и 10 никогда не сталкиваются.
 
Пример 2:
 
    Вход: asteroids = [8,-8]
    Выход: []
    Объяснение: 8 и -8 сталкиваются, взрывая друг друга.
 
Пример 3:
 
    Вход: asteroids = [10,2,-5]
    Выход: [10]
    Объяснение: 2 и -5 сталкиваются, в результате остаётся -5. 10 и -5 сталкиваются, в результате остаётся 10.
 
Пример 4:
 
    Вход: asteroids = [3,5,-6,2,-1,4]
    Выход: [-6,2,4]
    Объяснение: астероид -6 взрывает астероиды 3 и 5, а затем продолжает лететь влево.
    С другой стороны, астероид 2 уничтожает -1. Поскольку 2 и 4 оба движутся вправо, они никогда не сталкиваются.

leetcode