首页 > 试题广场 >

线段重合

[编程题]线段重合
  • 热度指数:387 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
每一个线段都有start和end两个数据项,表示这条线段在X轴上从start位置开始到end位置结束。给定一批线段,求所有重合区域中最多重合了几个线段。



输入描述:
第一行一个数N,表示有N条线段
接下来N行每行2个数,表示线段起始和终止位置


输出描述:
输出一个数,表示同一个位置最多重合多少条线段
示例1

输入

3
1 2
2 3
1 3

输出

3
#include <bits/stdc++.h>

using namespace std;

int findMinArrowShots(vector<vector<int>>& points) {
    priority_queue<int, vector<int>, greater<int>> heap;

    int ans = 0;
    int n = points.size();

    sort(points.begin(), points.end(), [](const vector<int>& x1,
    const vector<int>& x2) {
        return x1[0] < x2[0]; // 按照气球的开始位置排序
    });

    for (int i = 0; i < n; ++i) {
        while (!heap.empty() &&
                heap.top() < points[i][0]) { // 检查当前箭是否能够射中当前气球
            heap.pop();
        }
        heap.push(points[i][1]); // 改为存储气球的结束位置
        ans = max(ans, (int)heap.size());
    }
    return ans;
}

int main() {
    vector<vector<int>> points;
    int n;

    cin >> n;

    points.resize(n, vector<int>(2)); // 分配内存空间
    for (int i = 0; i < n; i++) {
        cin >> points[i][0] >> points[i][1];
    }

    int ans = findMinArrowShots(points);
    cout<<ans<<endl;
    
    return 0;
}


编辑于 2024-03-09 09:27:30 回复(0)
import java.util.*;

public class Main {
    /**
     * @param lines 二维数组,行数表示线段个数,列有两列,第一列表示start,第二列表示end
     * @return 最大重叠线段数
     */
    public static int maxCover(int[][] lines) {
        //开始排序
        Arrays.sort(lines, (a, b) -> (a[0] - b[0]));
        //默认为小根堆
        PriorityQueue<Integer> heap = new PriorityQueue<>();
        int max = -1;
        for (int[] line : lines) {
            while (!heap.isEmpty() && heap.peek() < line[0]) {
                heap.poll();
            }
            heap.add(line[1]);
            max = Math.max(max, heap.size());
        }
        return max;
    }

    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        int n = input.nextInt();
        int[][] lines = new int[n][2];
        for (int i = 0; i < n; i++) {
            lines[i][0] = input.nextInt();
            lines[i][1] = input.nextInt();
        }
        System.out.println(maxCover(lines));
    }
}

发表于 2022-07-10 17:24:23 回复(0)
import java.util.Arrays;
import java.util.Comparator;
import java.util.PriorityQueue;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int time = sc.nextInt();
        int[][] times = new int[time][2];
        for(int i=0;i<time;i++){
            times[i][0] = sc.nextInt();
            times[i][1] = sc.nextInt();
        }
        Arrays.sort(times, new Comparator<int[]>() {
            @Override
            public int compare(int[] o1, int[] o2) {
                return o1[0]-o2[0];
            }
        });

        PriorityQueue<int[]> queue = new PriorityQueue<>(new Comparator<int[]>() {
            @Override
            public int compare(int[] o1, int[] o2) {
                return o1[1]-o2[1];
            }
        });
        int maxSize = 1;
        queue.add(times[0]);
        for(int i=1;i<times.length;i++){
            while(!queue.isEmpty()){
                int[] peek = queue.peek();
                if(peek[1]<times[i][0]){
                    queue.poll();
                }else{
                    break;
                }
            }
            queue.add(times[i]);
            maxSize = Math.max(maxSize,queue.size());
        }

        System.out.println(maxSize);
    }
}



发表于 2022-04-24 14:52:34 回复(0)