Problem 2 Asteroid Collision

High Level: 每颗行星,尝试撞

Case 1: 正方向==》 model as left, keep ==> store it in stack

  • 正向最后保留的星星其实应该是开放的做括号==》 stack里==> i左边不包含i的部分

Case2: 负方向==〉 model as right

  • case 2.1 never seen a left before

    • 直接把这个行星进result==》 本质上是上一道题的非法右括号

  • case 2.2 遇到过正向飞的小行星

    • 比大小

      • 负方向大:爆炸---pop--不要正向

      • 正方向大:不要现在的

      • 一样大:来的不要的,还得掏出来一个

  • 先加往左飞的,通过当场记录,就像你发现违规的右括号

  • 然后再从index开始把向右飞的加进去

public int[] collision(int[] array) {
    List<Integer> result = new ArrayList<>();
    // assume array valid
    int i = 0;
    int j = 0;
    while (j < array.length) {
        if (array[j] > 0) {. // 向右飞的
            array[i] = array[j];
            i++;
            j++;
        }
        else { //向左飞的(没全部炸掉全部炸掉?)
            int abs = Math.abs(array[j]);
            if (i == 0) { // 假设你是第一个向左飞的
                result.add(array[j]);
                j++;
            } else {
                boolean flag = false;
                while (i > 0) { // 这颗向左的行星,一直可以消灭
                    if (array[i - 1] < abs) { 
                        i--;
                    }
                    else if (array[i - 1] == abs) {
                        i--;
                        flag = true;
                        break;
                    }
                    else  { //一个都炸不了
                        break;
                    }
                }
                // 1. 你最牛,肯定加。 2. 你遇到了跟你一样大的,不加,你还不如放方向的也不能加
                if (i == 0 && !flag) { //你没有同归于尽
                    result.add(array[j]);
                }
                j++;
            }
        }
    }
    //最有应该一共剩多少颗行星,往左飞:result.size(), 往右飞:i
    int[] resultArray = new int[result.size() + i];
    int index = 0;
    for (Integer element: result) {
        resultArray[index] = element;
        index++;
    }
    for (int k = 0; k < i ; k++) {
        resultArray[index] = array[k];
        index++
    }
    return resultArray;
}

Last updated