当前位置: 首页 > news >正文

扫描线算法笔记(C++)

问题引入

给出飞机的起飞和降落时间的列表, 用序列 interval 表示. 请计算出天上同时最多有多少架飞机.

样例:

  1. interval = [(1, 10), (2, 3), (5, 8), (4, 7)]: 输出 3. 图解如下:

    airplaine

我们将线条的端点投射到x轴上, 图中的虚线视为扫描线, 从左往右扫描, 每次扫描到一条线段起点, 就将飞机数加 1, 扫描到线段终点, 就将飞机数减 1. 去整个过程中的最大值即为答案.

代码实现

代码实现中需要注意以下几点:

  1. 要对时间段进行排序(按照起点排序), 否则无法保证事件按照时间顺序处理.
  2. 要记录端点是起飞还是降落, 否则无法正确处理.
  3. 事件保存的时候仅需保存时间点(起点/终点)以及标记(起飞/降落), 无需将时间段信息保存在事件中.
#include <algorithm>
#include <iostream>
#include <vector>

// 定义事件结构体, 包含时间和标记
struct Event {
   
  int time;
  int flag;  // 起飞为 1, 降落为 -1

  Event(int t, int f) : time(t), flag(f) {
   }

  // 重载小于运算符, 用于排序
  bool operator<(const Event& other) const {
   
    if (time == other.time) {
   
      return flag < other.flag;  // 降落事件优先处理
    }
    return time < other.time;
  }
};

int countMaxAirplanes(std::vector<std::pair<int, int>>& intervals) {
   
  std::vector<Event> events;

  // 遍历所有飞机的起飞和降落时间, 将其转换为事件
  for (const auto& interval : intervals) {
   
    events.emplace_back(interval.first, 1);    // 起飞事件
    events.emplace_back(interval.second, -1);  // 降落事件
  }

  // 对事件按时间排序
  std::sort(events.begin(</

相关文章:

  • Java 大视界 -- 区块链赋能 Java 大数据:数据可信与价值流转(84)
  • 架构——LVS负载均衡主要模式及其原理、服务水平、优缺点
  • 基于云计算、大数据与YOLO设计的火灾/火焰目标检测
  • 深度学习在蛋白质-蛋白质相互作用(PPI)领域的研究进展(2022-2025)
  • 【网络编程】网络编程基础:TCP/UDP 协议
  • 关于使用雪花算法生成唯一ID,返回给前端ID不一致的问题
  • 图解JVM-1. JVM与Java体系结构
  • 解决DeepSeek服务器繁忙问题:本地部署与优化方案
  • Centos虚拟机扩展磁盘空间
  • 仿 Sora 之形,借物理模拟之技绘视频之彩
  • Mac M1中安装、配置、常用Homebrew
  • 百度搜索和文心智能体接入DeepSeek满血版——AI搜索的新纪元
  • 固井配方推荐知识图谱思路
  • Vue前端开发-Vant组件之Button组件
  • 【面试题】杭州士腾科技-面试题汇总
  • 23种设计模式 - 模板方法
  • 数据结构之BST、AVL、红黑树、哈夫曼树与B族树
  • 中期检查表
  • Java学习教程,从入门到精通,Java 流(Stream)、文件(File)和IO 语法知识点及案例代码(125)
  • 基于SSM框架的宠物之家系统(有源码+论文!!!)
  • 德国联邦议院6日下午将举行总理选举第二轮投票
  • 科技日报刊文批院士专家“赶场式”跑会:助长浮躁之气功利之心
  • “穿越看洪武”,明太祖及其皇后像台北故宫博物院南园展出
  • 这样喝酸奶相当于在喝糖水,会导致娃龋齿、肥胖
  • 国际观察|韩国在政局多重不确定性中迎接总统选举
  • 扬州市中医院“药膳面包”走红,内含党参、黄芪等中药材