• 区间合并【排序、栈】


    问题

    给定一组区间,合并所有有重叠的区间.

    例子1:
    Input: [[1,3],[2,6],[8,10],[15,18]]
    Output: [[1,6],[8,10],[15,18]]
    解释: 由于[1,3] 和 [2,6] 有重叠区域, 合并为 [1,6].

    例子2:
    Input: [[1,4],[4,5]]
    Output: [[1,5]]
    解释: 区间 [1,4] 和 [4,5] 可被视为重叠区间.

    思路

    先按左区间进行排序(右区间可以不管),然后将每一个区间和栈内的区间进行比较,如果可以合并更新栈内的区间,否则,栈内区间出栈(进入结果),并将当前区间进栈(切记!!!!)

    实现

     1 import java.util.*;
     2 
     3 
     4 public class Main {
     5 
     6     public static class Block {
     7         int left;
     8         int right;
     9 
    10         public Block(int left, int right) {
    11             this.left = left;
    12             this.right = right;
    13         }
    14     }
    15 
    16     public static void main(String[] args) {
    17         Scanner scan = new Scanner(System.in);
    18 
    19         while (scan.hasNext()) {
    20             int n = scan.nextInt();
    21             Block[] arr = new Block[n];
    22             for (int i = 0; i < n; ++i) {
    23                 int left = scan.nextInt();
    24                 int right = scan.nextInt();
    25                 arr[i] = new Block(left, right);
    26             }
    27             Arrays.sort(arr, new Comparator<Block>() {
    28                 @Override
    29                 public int compare(Block o1, Block o2) {
    30                     int p = o1.left - o2.left;
    31                     if (p != 0) {
    32                         return p;
    33                     }
    34 
    35                     return o1.right - o2.right;
    36                 }
    37             });
    38             int rl = 0, rr = 0;
    39             boolean empty = true;//指示栈是否为空
    40             List<Block> res = new LinkedList<Block>();
    41 
    42             for (int i = 0; i < n; ++i) {
    43                 if (empty) {
    44                     rl = arr[i].left;
    45                     rr = arr[i].right;
    46                     empty = false;
    47                     continue;
    48                 }
    49 
    50                 if (arr[i].left <= rr) {
    51                     rr = Math.max(rr, arr[i].right);
    52                 } else {
    53                     res.add(new Block(rl, rr));
    54                     --i;//--i的目的是将当前区间入栈,因为empty为空了,当前区间可以直接进栈
    55                     empty = true;
    56                 }
    57             }
    58 
    59             if (!empty) {
    60                 res.add(new Block(rl, rr));
    61             }
    62 
    63             for (Block b : res) {
    64                 System.out.println(b.left + "->" + b.right);
    65             }
    66 
    67         }
    68 
    69     }
    70 }
  • 相关阅读:
    《动手能力强与技术水平低》(2009/12/14)
    《为什么程序员被喻为“IT农民工”》(2009/12/12)
    对于关键字Ref和Out的理解
    2008世界500强排名(1100位)
    Javascript取select的选中值和文本
    使用 FreeNAS 下載 eMule
    程序员35岁后的三条出路
    二维条码 QR Code
    笔记本CPU性能排行榜Comparison of Mobile Processors (CPU Benchmarks)
    如何在C#中播放AVI短片并使背景透明
  • 原文地址:https://www.cnblogs.com/oldBook/p/13557839.html
Copyright © 2020-2023  润新知