Q30-code1249-移除无效的括号 + Q31-code735-小行星碰撞

92 阅读1分钟

Q30-code1249- 移除无效的括号

实现思路

1 方法1: 栈 + willRemovs记录

  • 尽量使用性能更好的 Set
  • 需要注意如果到最后还有lefts,说明这部分的左括号没有对应的右括号,所以也是多余的

参考文档

01-直接参考实现

代码实现

1 方法1: 栈 + willRemovs记录 时间复杂度: O(n); 空间复杂度(n)

function minRemoveToMakeValid(s: string): string {
  let lefts = [], removes = new Set();
  const chars = [...s];
  chars.forEach((char, i) => {
    if (char === "(") lefts.push(i);
    if (char === ")") lefts.length ? lefts.pop() : removes.add(i);
  });
  // 易错点1:需要注意如果此时还有lefts,说明这部分的左括号没有对应的右括号,所以也是多余的
  return chars.filter(
    (_ , i) => !removes.has(i) && !lefts.includes(i)
  ).join("");
}

Q31-code735- 小行星碰撞

实现思路

1 方法1: 栈

1 注意 只需要考虑 [-x1, +x2, +x2] 和 aster是负数的 这种 +-相对运动情况 即可

  • 因为 --、++、-+(1个向左运动,1个向右运动)这3种情况 是不可能相撞的,不需考虑

参考文档

01-直接参考实现

代码实现

1 方法1: 栈 时间复杂度: O(n); 空间复杂度(1)

function asteroidCollision(asteroids: number[]): number[] {
  const st = [];
  for (let aster of asteroids) {
    // 表示当前行星是否还存在
    let alive = true;
    // 只需要考虑 [-x1, +x2, +x2] 和 aster是负数的 这种 +-相对运动情况 即可
    // 因为 --、++、-+(1个向左运动,1个向右运动)这3种情况 是不可能相撞的,不需考虑
    while (alive && aster < 0 && st.length && st.at(-1) > 0) {
      const diff = -aster - st.at(-1);
      if (diff > 0) st.pop();
      if (diff < 0) alive = false;
      if (diff === 0) {
        st.pop();
        alive = false;
      }
    }
    if (alive) st.push(aster);
  }
  return st;
}