zoukankan      html  css  js  c++  java
  • 735.行星碰撞

    2020-07-16
    行星碰撞

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

    对于数组中的每一个元素,其绝对值表示行星的大小,

    正负表示行星的移动方向(正表示向右移动,负表示向左移动)。

    每一颗行星以相同的速度移动。

    找出碰撞后剩下的所有行星。碰撞规则:两个行星相互碰撞,

    较小的行星会爆炸。如果两颗行星大小相同,则两颗行星都会爆炸。

    两颗移动方向相同的行星,永远不会发生碰撞。

    题解:
    思路1:栈
    /**
     * @param {number[]} asteroids
     * @return {number[]}
     */
    var asteroidCollision = function (asteroids) {
      let stack = []; // 栈 存的是不会发生碰撞的项
      for (let i = 0; i < asteroids.length; i++) { // 遍历
        let flag = true; // 判断当前遍历到的项 是否会爆炸
        // 如果两项会发生碰撞
        while (stack.length && isTouch(stack[stack.length - 1], asteroids[i])) { 
          if (Math.abs(stack[stack.length - 1]) < Math.abs(asteroids[i])) { // 栈顶的小
            stack.pop(); // 出栈
          } else if (Math.abs(stack[stack.length - 1]) === Math.abs(asteroids[i])) { // 栈顶的与当前等大
            flag = false; // 当前项爆炸 
            stack.pop(); // 栈顶出栈
            break; // 因为当前项爆炸了 所以退出while 它不可能再与栈里的其他项发生碰撞
          } else {
            flag = false; // 栈顶的更大 当前项爆炸
            break;
          }
        }
        // 如果栈是空的 或者栈顶的与当前项不碰撞 且 当前项在与栈顶比较完后没有爆炸 那么把当前项入栈
        if ((!stack.length || !isTouch(stack[stack.length - 1], asteroids[i])) && flag)
          stack.push(asteroids[i]);
      }
      // 结果
      return stack;
    };
    
    // 监测左右两个星球是否会碰撞
    function isTouch(a, b) {
      if ((a < 0 && b < 0) || (a > 0 && b > 0) || (a < 0 && b > 0)) return false;
      return true;
    }

     
  • 相关阅读:
    求最小正整数x,A^x=1(mod M)求阶模板
    欧拉函数模板
    高次同余方程模板BabyStep-GiantStep
    Pollard-Rho大整数拆分模板
    Miller-Rabin大素数测试模板
    JSON教程基础
    11.@RequestParam @RequestBody @PathVariable 等参数绑定注解详解
    代码格式化
    使用FireFox插件RESTClient、HttpRequester模拟http(get post)请求
    SpringBoot入门最详细教程
  • 原文地址:https://www.cnblogs.com/lanpang9661/p/13321330.html
Copyright © 2011-2022 走看看