您的位置:首页 > 编程语言

3、区间重合判断

2016-07-03 15:42 246 查看
(1)问题 

给定一个源区间[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)结果

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息