Q30-code1249- 移除无效的括号
实现思路
1 方法1: 栈 + willRemovs记录
- 尽量使用性能更好的 Set
- 需要注意如果到最后还有lefts,说明这部分的左括号没有对应的右括号,所以也是多余的
参考文档
代码实现
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种情况 是不可能相撞的,不需考虑
参考文档
代码实现
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;
}