「这是我参与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
};
总结
无论做什么分析最重要,其中我们分析了题目,分析了解题思路,其实在分析完解题思路后,代码其实就是很简单的事情了,养成习惯,无论做什么之前,都要进行分析,这样有助于你更快更好的完成这件事。