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:
		就检查一次长的区间是否被包含&&宽的长度区间是否被包含
	*/
}
posted @ 2020-11-24 14:50  BOTAK  阅读(248)  评论(0编辑  收藏  举报