【Leetcode】735. Asteroid Collision

記錄演算法發表於2020-12-31

題目地址:

https://leetcode.com/problems/asteroid-collision/

給定一個不含 0 0 0的長 n n n陣列 A A A,表示一個數軸上的小行星的速度,正數代表向右,負數代表向左,絕對值代表小行星的質量。同向的小行星不會相撞,但反向的小行星會相撞,相撞的結果是,質量大的繼續存在,小的爆炸;如果質量一樣則都爆炸。問最後剩下的小行星的速度狀態是什麼,返回一個陣列。

其實就是模擬相撞的過程。開個棧,遍歷 A A A,如果遇到了向右的小行星則直接入棧;否則,如果棧空或者棧頂也是向左的小行星,則也入棧,如果棧不空並且棧頂是向右的小行星,則進行相撞操作,直到棧空或者棧頂是向左的小行星為止,同時記錄一下當前小行星是否爆炸。如果退出迴圈的時候當前小行星沒有爆炸,則入棧。最後逆序存一下棧,就是答案。程式碼如下:

import java.util.ArrayDeque;
import java.util.Deque;

public class Solution {
    public int[] asteroidCollision(int[] asteroids) {
        Deque<Integer> stack = new ArrayDeque<>();
        for (int asteroid : asteroids) {
            if (asteroid > 0) {
                stack.push(asteroid);
            } else {
                if (stack.isEmpty() || stack.peek() < 0) {
                    stack.push(asteroid);
                    continue;
                }
                
                boolean exploded = false;
                while (!stack.isEmpty() && stack.peek() > 0) {
                    if (stack.peek() > -asteroid) {
                        exploded = true;
                        break;
                    } else if (stack.peek() == -asteroid) {
                        exploded = true;
                        stack.pop();
                        break;
                    } else if (stack.peek() < -asteroid) {
                        stack.pop();
                    }
                }
                
                // 如果asteroid沒炸,則入棧
                if (!exploded) {
                    stack.push(asteroid);
                }
            }
        }
        
        int[] res = new int[stack.size()];
        int idx = 0;
        while (!stack.isEmpty()) {
            res[idx++] = stack.pop();
        }
        
        // 最後反個序
        reverse(res);
        return res;
    }
    
    private void reverse(int[] A) {
        for (int i = 0, j = A.length - 1; i < j; i++, j--) {
            int tmp = A[i];
            A[i] = A[j];
            A[j] = tmp;
        }
    }
}

時空複雜度 O ( n ) O(n) O(n)

相關文章