2.19 区间重合判断
2.19 区间重合判断
基本问题:给定一个区间[x,y]和N个无序的目标区间\([x_1,y_1],[x_2,y_2],...,[x_n,y_n]\),判断源区间[x,y]是不是在目标区间内?
解法:
- 解法1 : 投影法 , 时间复杂度\(O(n^2)\)
- 解法2 : 区间合并法
拓展问题:如何处理二维空间中的覆盖问题?例如在Windows桌面上有若干窗口,如何判断某一窗口是否完全被其他窗口覆盖?
answer:就检查一次长的区间是否被包含&&宽的长度区间是否被包含
all coding
// 2.19 区间重合判断
import java.util.*;
class Test{
public static void main(String[] args) {
/**
基本问题:给定一个区间[x,y]和N个无序的目标区间$[x_1,y_1],[x_2,y_2],...,[x_n,y_n]$,判断源区间[x,y]是不是在目标区间内?
[1,6] --> {[2,3][1,2][3,9]]
> 解法:
解法1 : 投影法
时间复杂度$O(n^2)$
解法2 : 区间合并法
*/
int[] target = new int[]{1,6};
int[][] parts = new int[][]{{2,3},{1,2},{3,9}};
System.out.println(isInner1(target,parts));
System.out.println(isInner2(target,parts));
}
/**
解法1 : 投影法
用一个数组模拟x轴,然后进行投影。
*/
public static boolean isInner1(int[] target,int[][] parts){
int max = Integer.MIN_VALUE;
for(int[] part:parts) for(int i:part) max=Math.max(max,i);
int[] arr = new int[max+1];
for(int[] part:parts) for(int i=part[0];i<=part[1];i++) arr[i] = 1;
for(int i = target[0];i<=target[1];i++) if(arr[i] == 0) return false;
return true;
}
/**
解法2:合并区间
*/
public static boolean isInner2(int[] target,int[][] parts){
int[][] arr = merge(parts);
for(int[] part:arr) if(target[0] >= part[0] && target[1] <= part[1]) return true;
return false;
}
public static int[][] merge(int[][] parts) {
if (parts.length == 0) {
return new int[0][2];
}
Arrays.sort(parts,(o1,o2)->(o1[0] - o2[0]));
List<int[]> merged = new ArrayList<int[]>();
for (int i = 0; i < parts.length; ++i) {
int L = parts[i][0], R = parts[i][1];
if (merged.size() == 0 || merged.get(merged.size() - 1)[1] < L) {
merged.add(new int[]{L, R});
} else {
merged.get(merged.size() - 1)[1] = Math.max(merged.get(merged.size() - 1)[1], R);
}
}
return merged.toArray(new int[merged.size()][]);
}
/**
拓展问题:
如何处理二维空间中的覆盖问题?例如在Windows桌面上有若干窗口,如何判断某一窗口是否完全被其他窗口覆盖?
answer:
就检查一次长的区间是否被包含&&宽的长度区间是否被包含
*/
}
Saying Less Doing More