首页 > 试题广场 >

线段重合

[编程题]线段重合
  • 热度指数: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
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)