每日一题 -- leetCode735

379 阅读2分钟

image.png 「这是我参与2022首次更文挑战的第27天,活动详情查看:2022首次更文挑战

前言

每日一题,轻松解题

每日一题为刷题系列 每日刷一题LeetCode题,并且对题目进行分析,分享思路。

正文

:行星碰撞

难度:中等

题目要求:

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

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

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

分析题目:

一个数组,正负代表运动方向,方向相同不会相撞,方向相反小的会爆炸,相等一起爆炸,那就是符号相反,只会剩下大的,最后得出剩下的所有行星。

举个例子

输入: asteroids = [4,9,-5]
输出: [4,9]
解释: 9 和 -5 碰撞后只剩下 9 。 4 和 9 永远不会发生碰撞。

:解题

方法一 : 栈

理清思路:

假设栈中顶部元素为 top,一个新的小行星 new 进来了。如果 new 向右移动(new>0),或者 top 向左移动(top<0),则不会发生碰撞。 否则,如果 abs(new) < abs(top),则新小行星 new 将爆炸;如果 abs(new) == abs(top),则两个小行星都将爆炸;如果 abs(new) > abs(top),则 top 小行星将爆炸(可能还会有更多小行星爆炸,因此我们应继续检查)。

分析: 把数组看作栈,栈是什么,先进后出,像个桶一样,一个一个往里进。 所以进去一个,判断正负是否会相撞。并且判断相撞后剩下哪个就可以了。

编辑代码:

var asteroidCollision = function (asteroids) {
    const stack = [];
    for (let i = 0; i < asteroids.length; i++) {
        const curr = asteroids[i];
        let top = stack.slice(-1)[0];
        if (top > 0 && curr < 0) {
            while (top > 0 && stack.length && top < -curr) {
                stack.pop();
                top = stack.slice(-1)[0]
            }
            if (top === -curr) {
                stack.pop();
            } else if (!top || top < 0) {
                stack.push(curr);
            }
        } else {
            stack.push(curr)
        }
    }
    return stack
};

总结

无论做什么分析最重要,其中我们分析了题目,分析了解题思路,其实在分析完解题思路后,代码其实就是很简单的事情了,养成习惯,无论做什么之前,都要进行分析,这样有助于你更快更好的完成这件事。