堆相关例子-最大线段重合问题

问题描述

给定很多线段,每个线段都有两个数[start, end],

表示线段开始位置和结束位置,左右都是闭区间

规定:

1)线段的开始和结束位置一定都是整数值

2)线段重合区域的长度必须>=1

返回线段最多重合区域中,包含了几条线段

例如:[3,10],[3,4],[5,9],[7,13],[9,10]返回3

暴力方式解题

思路

先得到线段最小点和最大点,这是所有线段在x轴上的范围 在该范围上,取小数点如0.5进行查看,即查看每个0.5位置,有没有线段包含该点,记录多少条线段 max 用一个变量cover保存所有点中最多覆盖的线段条数 最后得到的cover就是重合区域最多的线段数目

图例

利用小根堆解题

思路

1.将开始点排序后,遍历该数组

2.将堆中所有 <= 当前线段的开始点的数弹出

3.将该点的结束点加入到堆中

4.记录过程中堆的历史最大长度

5.遍历结束后该长度就是其重合最多线段的个数

图例

待排序数组,且以按开始点排序

[3,10],[3,4],[5,9],[7,13],[9,10]

  1. 遍历到[3,10]时
  1. 遍历到[3,4]时
  1. 遍历到[5,9]时

4.遍历到[7,13]时

5.遍历到[9,10]时

code
java 复制代码
public static int coverMax(int [][] lines){
        if(lines.length < 2)
            return 0;
        Arrays.sort(lines, (a, b) -> (a[0] - b[0]));
        PriorityQueue<Integer> minHeap = new PriorityQueue<>();
        int max = 0;
        for (int [] line : lines){
            while (!minHeap.isEmpty() && minHeap.peek() <= line[0]){
                minHeap.poll();
            }
            minHeap.add(line[1]);
            max = Math.max(max,minHeap.size());
        }
        return max;
}
相关推荐
SHARK_pssm18 分钟前
【数据结构——顺序表】
c语言·数据结构·经验分享·笔记
yong999019 分钟前
基于灰狼算法优化支持向量回归(GWO-SVR)的混合算法
算法·数据挖掘·回归
sali-tec20 分钟前
C# 基于OpenCv的视觉工作流-章53-QR二维码1
图像处理·人工智能·opencv·算法·计算机视觉
一诺加油鸭23 分钟前
若依后端系统集成 Swagger 接口文档功能
java·开发语言
ECT-OS-JiuHuaShan24 分钟前
功夫不负匠心人,渡劫代谢舞沧桑
android·开发语言·人工智能·算法·机器学习·kotlin·拓扑学
云烟成雨TD29 分钟前
Spring AI Alibaba 1.x 系列【40】多智能体核心模式 - 智能体作为工具(Agent as Tool)
java·人工智能·spring
智者知已应修善业32 分钟前
【51单片机ADC-MAX1241/ADC0832驱动】2023-6-6
c++·经验分享·笔记·算法·51单片机
re林檎37 分钟前
算法札记——4.26
算法
测试员周周41 分钟前
【踩坑系列3】飞书机器人集体“失联“?3 个 Gateway 进程让我差点崩溃!一个测试老兵的排查实录
java·python
aq553560042 分钟前
Laravel9.x新特性全解析
java·开发语言·数据库