数据结构与算--堆实现线段树

题目

给定很多线段,每个线段都有两个数start, end,表示线段开始位置和结束位置,左右都是闭区间,

规定:1. 线段开始和结束的位置一定都是整数值 2. 线段重合区域的长度必须>=1

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

java 复制代码
import java.util.Arrays;
import java.util.Comparator;
import java.util.PriorityQueue;

public class Code_coverMax {

    public static void main(String[] args) {
        int[][] lines = {
                {1,100},{5,99},{2,105},{10,200}, {20,110},{30,202},{15,150}
        };

        int cover = maxCover1(lines);
        int[][] m = {
                {1,100},{5,99},{2,105},{10,200}, {20,110},{30,202},{15,150}
        };

        int cover2 = maxCover2(m);
        System.out.println(cover +" "+cover2);
    }

    public static int maxCover1(int[][] lines){
        int min = Integer.MAX_VALUE ;
        int max = Integer.MIN_VALUE;

        for (int i = 0; i < lines.length; i++) {
            min = Math.min(min,lines[i][0]);
            max = Math.max(min,lines[i][1]);
        }

        int cover = 0;
        for (double i = min+0.5; i < max; i = i+0.5) {
            int cur = 0;
            for (int j = 0; j < lines.length; j++) {
                if(lines[j][0] < i && lines[j][1] > i){
                    cur++;
                }
            }
            cover = Math.max(cover,cur);
        }

        return cover;
    }

    public static int maxCover2(int[][] m){
        Line[] lines = new Line[m.length];

        for (int i = 0; i < m.length; i++) {
            lines[i] = new Line(m[i][0],m[i][1]);
        }
        Arrays.sort(lines,new EndComparator());

        PriorityQueue<Integer> heap = new PriorityQueue<>(); // 小根堆
        int cover = 0;
        for (int i = 0; i < lines.length; i++) {
            int curStart = lines[i].start;
            while (!heap.isEmpty() && curStart>=heap.peek()){
                heap.poll();
            }

            heap.add(lines[i].end);
            cover = Math.max(cover,heap.size());
        }

        return cover;
    }

    public static class Line{
        public int start;
        public int end;
        public Line(int start, int end){
            this.start = start;
            this.end = end;
        }
    }

    public static class EndComparator implements Comparator<Line>{

        @Override
        public int compare(Line o1, Line o2) {
            return o1.start - o2.start;
        }
    }
}
相关推荐
独泪了无痕8 小时前
探索Pinyin4j-Java中的拼音转换利器
java·后端
道尔柯南9 小时前
C++ string 类详解:从常用接口到深拷贝,彻底掌握字符串处理
android·java·c++
kingx310 小时前
Bugku 3122 谷歌小恐龙题解:纯离线逆向 Vault 的 AES-GCM 加密资源(附 Python 解密器)
java·逆向·ctf·bugku·aes-gcm
Dream it possible!12 小时前
LeetCode 面试经典 150_多维动态规划_交错字符串(97_C++_中等)
算法·leetcode·面试·动态规划
DevOpenClub12 小时前
职教高考控制线 API:招生类别枚举、筛选与空分数含义
java·数据库·高考
心抵鹊12 小时前
算法之双指针系列(一)
算法·leetcode
十二13 小时前
【洛谷题解】P1083 [NOIP 2012 提高组] 借教室(二分答案 + 差分)
数据结构·c++·算法·蓝桥杯
露天赏雪13 小时前
第3篇:Sentinel熔断降级实战:大模型接口抖动时的服务兜底方案
java·开发语言·人工智能·spring boot·spring·servlet·sentinel
小此方14 小时前
[算法实战论:动态规划]回文串问题的dp解法,回文串问题的母题,以及以此为基础的派生题
算法·动态规划
天天被压力14 小时前
【A股分钟级高频数据完全手册 #06】北交所分钟级数据接口:京市股票Pro版最新分时
java·人工智能·python