3、区间重合判断
2016-07-03 15:42
246 查看
(1)问题
给定一个源区间[x,y]和N个无序的目标区间[x1,y1] [x2,y2] ... [xn,yn],判断源区间[x,y]是不是在目标区间内。
(2)实现
(3)结果
给定一个源区间[x,y]和N个无序的目标区间[x1,y1] [x2,y2] ... [xn,yn],判断源区间[x,y]是不是在目标区间内。
(2)实现
package com.test; public class Test { public static void main(String[] args) { Pair[] targets = { new Pair(4, 7), new Pair(1, 4), new Pair(8, 10),new Pair(6, 9) }; Pair[] origins = { new Pair(0, 3), new Pair(1, 9), new Pair(2, 10) }; System.out.print("原始目标区间:"); print(targets,targets.length); // 区间排序(时间复杂度O(Nlog2N)) quickSort(targets, 0, targets.length - 1); System.out.print("排序后的目标区间:"); print(targets, targets.length); // 合并区间(时间复杂度O(N)) int k = 0; for (int i = 1; i < targets.length; i++) { if (targets[k].end >= targets[i].begin) { targets[k].end = Math.max(targets[k].end, targets[i].end); } else { k++; targets[k].begin = targets[i].begin; targets[k].end = targets[i].end; } } System.out.print("合并后的目标区间:"); print(targets, k+1); // 查找(单次查找时间复杂度O(log2N),总的时间复杂度为O(Nlog2N+k*log2N+N),k为源区间的个数) for (int i = 0; i < origins.length; i++) { if (isContain(targets, k, origins[i])) { System.out.println("源区间(" + origins[i].begin + "," + origins[i].end + ")" + "在目标区间."); } else { System.out.println("源区间(" + origins[i].begin + "," + origins[i].end + ")" + "不在目标区间."); } } } private static void print(Pair[] pairs,int n) { for (int i = 0; i < n; i++) { Pair pair = pairs[i]; System.out.print("(" + pair.begin + "," + pair.end + ") "); } System.out.println(); } public static boolean isContain(Pair[] targets, int k, Pair origin) { int left = 0, right = k; while (left <= right) { int middle = (left + right) / 2; if (origin.begin >= targets[middle].begin && origin.end <= targets[middle].end) { return true; } if (origin.begin > targets[middle].end) { left = middle + 1; } else if (origin.end < targets[middle].begin) { right = middle - 1; } else { break; } } return false; } public static void quickSort(Pair[] pairs, int p, int r) { if (p < r) { int q = partition(pairs, p, r); quickSort(pairs, p, q-1); quickSort(pairs, q + 1, r); } } public static int partition(Pair[] pairs, int p, int r) { int i = p, j = r + 1; Pair pair = pairs[p]; while (true) { while (pairs[++i].compareTo(pair) < 0 && i < r); while (pairs[--j].compareTo(pair) > 0); if (i >= j) break; Pair temp = pairs[i]; pairs[i] = pairs[j]; pairs[j] = temp; } pairs[p] = pairs[j]; pairs[j] = pair; return j; } } class Pair implements Comparable<Pair> { int begin; int end; public Pair(int begin, int end) { super(); this.begin = begin; this.end = end; } @Override public int compareTo(Pair o) { return begin - o.begin; } }
(3)结果
相关文章推荐
- php基础阶段内容
- 【Github教程】史上最全github使用方法:github入门到精通
- Eclipse + Maven 搭建 SSH 环境
- Reverse Integer (python)
- [置顶] Java 多线程学习笔记(七)数据类型String的常量池特性
- Struts2 action中一个方法返回多个页面
- [置顶] Java 多线程学习笔记(六)synchronized 不具有继承性
- Struts 2学习(一)Struts 2环境搭建及示例程序编写
- [置顶] Java 多线程学习笔记(五)synchronized 锁重入
- C#教程之打印和打印预览
- eclipse中java build path下 allow output folders for source folders 无法勾选,该如何解决 eclipse中java build path下 allow output folders for source folders 无法勾选,
- [置顶] Java 多线程学习笔记(四)yield 介绍
- [置顶] Java 多线程学习笔记(三)-守护线程
- JSON java fastJson
- [置顶] Java 多线程 学习笔记(二)停止线程的几种方法
- codeforces gym 100645A
- QT串口通信(1)
- 初学java之12 泛型编程的个人理解总结
- [置顶] Java 多线程学习笔记 (一)interrupt
- 50道编程小题目之【水仙花数】