LintCode 1668. 区间最小覆盖

  • 数轴上有 n 个区间. 现在需要在数轴上选取一些点, 使得任意一个区间内至少包含一个点.

  • 返回最少选取的点的数目.

  • 样例

  • 样例 1:

  • 输入: [(1,5), (4,8), (10,12)]

  • 输出: 2

  • 解释:

  • 选择两个点: 5, 10

  • 第一个区间 [1, 5] 包含了 5

  • 第二个区间 [4, 8] 包含了 5

  • 第三个区间 [10, 12] 包含了 10

  • 样例 2:

  • 输入: [(1,5), (4,8), (5,12)]

  • 输出: 1

  • 解释: 所有区间都包含 5

    public class Solution {
    /**

    • @param a: the array a

    • @return: return the minimal points number
      */
      // write your code here
      public int getAns(List a) {
      int n=a.size();
      if (a == null || a.size() == 0)
      return 0;

      Collections.sort(a, new Comparator() {
      public int compare(Interval arg0, Interval arg1) {
      if (arg0.start > arg1.start) {
      return 1;
      } else if (arg0.start < arg1.start) {
      return -1;
      } else {
      return 0;
      }
      }
      });

      int result = 1;
      int rangeLeft = a.get(0).start;
      int rangeRight = a.get(0).end;

      for (int i = 1; i < n; ++i) {
      if (a.get(i).start <= rangeRight) {
      rangeRight = Math.min(a.get(i).end, rangeRight);
      } else {
      result++;
      rangeLeft = a.get(i).start;
      rangeRight = a.get(i).end;
      }

      }

      return result;
      // write your code here
      }
      }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值