【LeetCode 75】第二十五题(735)行星碰撞

目录

题目:

示例:

分析:

代码+运行结果:


题目:

示例:

分析:

给一个数组,数组里的元素表示行星,元素的符号决定行星运动的方向,元素的绝对值决定行星的大小,当行星发生碰撞,较小的行星会爆炸(消失),返回爆炸结束后的行星数组。

这种相邻元素发生操作的,以及有一定顺序要求的题目,都是可以用栈来做的.

由于题目要求返回vector,因此我们就用vector来模拟栈的操作,使用 *(vector.end()-1) 来获取栈顶元素,使用vector.pop_back()来弹出栈顶元素.

首先我们遍历小行星群(原数组),然后再进入判断,如果栈为空,那么不会发生碰撞,不用进一步判断,因此直接入栈.

如果小行星和栈顶的行星的同一个方向的(符号相同),那么也不会发生碰撞,也直接入栈.

然后如果小行星和栈顶行星方向不一样也不一定会发生碰撞,如果栈顶行星往左走(符号为-),而小行星往右走(符号为+),那么即使它们运动方向不一样也是不会发生碰撞的.

如果小行星左走,栈顶行星右走,那么它们就会发生碰撞,这时候我们需要进一步判断.

如果小行星更大,那么栈顶行星爆炸,我们将其出栈,并且由于可能新来的小行星会和新的栈顶行星接着发生碰撞,因此我们需要while循环判断.

如果栈顶行星更大,那么小行星爆炸,我们不用操作.

如果它们一样大,那么一起爆炸,将栈顶元素弹出,然后退出判断循环.

代码+运行结果:

cpp 复制代码
class Solution {
public:
    vector<int> asteroidCollision(vector<int>& asteroids) {
        vector<int>stack;
        for(int &a:asteroids){
            //判断栈是否为空,并且判断栈顶元素是否和新来的行星是同号
            if(stack.empty()||*(stack.end()-1)*a>0) stack.push_back(a);
            else{
                //如果栈顶元素和新来行星不同号,则可能发生碰撞(左正右负发生碰撞,左负右正不发生碰撞)
                while(!stack.empty()){
                    int temp=*(stack.end()-1);
                    if(a<0 && temp>0){  //如果是左正右负的情况则发生碰撞.
                        //如果栈顶元素比新来行星更大,那么新来的行星会爆炸,退出循环
                        if(temp>-a) break;  
                        //如果相同,两个一起爆炸,弹出栈顶元素,退出循环
                        else if(a==-temp){  
                            stack.pop_back();
                            break;
                        }
                        //如果新行星更大,那么栈顶爆炸(弹出)
                        else{
                            stack.pop_back();
                            //再做个判断,如果栈顶弹出后为空了,还需要把新行星入栈,然后退出循环.
                            if(stack.empty()){
                                stack.push_back(a);
                                break;
                          }  
                        }
                    }else{  //反之左负右正不发生碰撞,退出循环.
                        stack.push_back(a);
                        break;
                    }
                }
            }
        }
        return stack;
    }
};
相关推荐
sali-tec1 分钟前
C# 基于OpenCv的视觉工作流-章18-图像缩放
图像处理·人工智能·opencv·算法·计算机视觉
txinyu的博客10 分钟前
解析muduo源码之 BoundedBlockingQueue.h
c++
好奇龙猫10 分钟前
【大学院-筆記試験練習:线性代数和数据结构(19)】
数据结构·线性代数
2401_8414956413 分钟前
【LeetCode刷题】LRU缓存
数据结构·python·算法·leetcode·缓存·lru缓存·查找
2401_8414956414 分钟前
【数据挖掘】Apriori算法
python·算法·数据挖掘·数据集·关联规则挖掘·关联规则·频繁项集挖掘
楼田莉子23 分钟前
Linux进程间通信——System V系列
linux·服务器·c++·学习·信息与通信
一路往蓝-Anbo25 分钟前
第 2 篇:单例模式 (Singleton) 与 懒汉式硬件初始化
开发语言·数据结构·stm32·单片机·嵌入式硬件·链表·单例模式
321.。26 分钟前
从 0 到 1 实现 Linux 下的线程安全阻塞队列:基于 RAII 与条件变量
linux·开发语言·c++·学习·中间件
疯狂的喵27 分钟前
实时信号处理库
开发语言·c++·算法
小O的算法实验室29 分钟前
2023年ESWA SCI1区TOP,地面车辆与无人机协同系统的多区域覆盖双层路径规划,深度解析+性能实测
算法·论文复现·智能算法·智能算法改进