前言
情况太多,一定要理清,再分类处理,否则细节错误一大堆,刷题是训练逻辑连贯和严谨的。
遍历,负数要么往左方遇到负数,要么就到边界;正数就不管,直接加入,毕竟往右走。结局一定是左负右正。
一、案例
二、题解
遍历,负数要么往左方遇到负数,要么就到边界;正数就不管,直接加入,毕竟往右走。结局一定是左负右正。
package com.xhu.offer.offerII;
import java.util.ArrayList;
import java.util.List;
//小行星碰撞
public class AsteroidCollision {
public int[] asteroidCollision(int[] asteroids) {
//遍历,负数要么往左方遇到负数,要么就到边界;正数就不管,直接加入,毕竟往右走。结局一定是左负右正。
//总结:多想细节处,把细节丰富进去,才不会小错一大把,逻辑不连贯。
//沉淀式的刷题,才有高效的提升,格局才能被打开。
List<Integer> cache = new ArrayList<>();
for (int asteroid : asteroids) {
if (cache.isEmpty() || cache.get(cache.size() - 1) * asteroid > 0 || cache.get(cache.size() - 1) < 0 && asteroid > 0) {
cache.add(asteroid);
continue;
}
boolean flag = false;
while (!cache.isEmpty()) {
flag = false;
int m = cache.get(cache.size() - 1);
if (m * asteroid > 0) {
cache.add(asteroid);
break;
}
if (Math.abs(m) > Math.abs(asteroid)) break;
if (-m == asteroid) {
cache.remove(cache.size() - 1);
break;
}
cache.remove(cache.size() - 1);
flag = true;
}
if (flag && cache.isEmpty()) cache.add(asteroid);
}
int[] res = new int[cache.size()];
int count = 0;
for (Integer i : cache) res[count++] = i;
return res;
}
}
总结
1)多想细节处,把细节丰富进去,才不会小错一大把,逻辑不连贯。
2)沉淀式的刷题,才有高效的提升,格局才能被打开。
参考文献
[1] LeetCode 原题