小行星碰撞

前言

情况太多,一定要理清,再分类处理,否则细节错误一大堆,刷题是训练逻辑连贯和严谨的。
遍历,负数要么往左方遇到负数,要么就到边界;正数就不管,直接加入,毕竟往右走。结局一定是左负右正。

一、案例

在这里插入图片描述

二、题解

遍历,负数要么往左方遇到负数,要么就到边界;正数就不管,直接加入,毕竟往右走。结局一定是左负右正。

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 原题

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值