[力扣算法题] 986. 区间列表的交集(欢迎一起讨论! 😃)
class Solution {
public static int[][] intervalIntersection(int[][] firstList, int[][] secondList) {
// // BP METHOD
// List<List<Integer>> li = new ArrayList<List<Integer>>();
// List<Integer> list;
// if(firstList==null || secondList== null)return null;
// System.out.println("h1");
// for(int i=0; i<firstList.length; ++i){
// for(int j=0; j<secondList.length; ++j){
// li = compare(firstList[i], secondList[j], li);
// }
// }
// // 去重
// for(int i=1; i<li.size(); ++i){
// List<Integer> a = li.get(i-1);
// List<Integer> b = li.get(i);
// System.out.println("a: "+a);
// System.out.println("b: "+b);
// if(a.get(0)==b.get(0)){
// li.remove(b);
// }
// }
// if(li.size()==0)return new int[][]{};
// int[][] a = new int[li.size()][li.get(0).size()];
// for (int i = 0; i < li.size(); i++) {
// Integer[] b = li.get(i).toArray(new Integer[li.get(i).size()]);
// for (int j = 0; j < li.get(i).size(); j++) {
// a[i][j] = b[j];
// }
// }
// return a;
// // BP METHOD
// type code of the optimization method follow the official website's resolution by myself
// I have to say this is awesome!!!
List<int []> result = new ArrayList();
int l1 = 0, l2 =0;
while(l1 < firstList.length && l2 < secondList.length){
int left = Math.max(firstList[l1][0], secondList[l2][0]);
int right = Math.min(firstList[l1][1], secondList[l2][1]);
if(left <= right){
result.add(new int[]{left, right});
}
if(firstList[l1][1] < secondList[l2][1]){
l1++;
}else{
l2++;
}
}
return result.toArray(new int[result.size()][]);
}
// type code of the optimization method follow the official website's resolution by myself
public static List<List<Integer>> compare(int []firstList, int []secondList, List<List<Integer>> li){
List<Integer> list;
if(firstList[1]<secondList[0] || secondList[1]<firstList[0]){ // 无交集
return li;
}else{
if(firstList[1]>secondList[0] && firstList[1]<secondList[1] && firstList[0]<secondList[0]){
list = new ArrayList<>();
list.add(secondList[0]);
list.add(firstList[1]);
li.add(list);
}else if(secondList[1]>firstList[0] && secondList[1]<firstList[1] && secondList[0]<firstList[0]){
list = new ArrayList<>();
list.add(firstList[0]);
list.add(secondList[1]);
li.add(list);
}else if(firstList[0]<=secondList[0] && firstList[1]>=secondList[1]){
list = new ArrayList<>();
list.add(secondList[0]);
list.add(secondList[1]);
li.add(list);
}else if(secondList[0]<=firstList[0] && secondList[1]>=firstList[1]){
list = new ArrayList<>();
list.add(firstList[0]);
list.add(firstList[1]);
li.add(list);
}
else if(secondList[1]==firstList[0] || secondList[0]==firstList[1]){
if(secondList[1]==firstList[0] ){
list = new ArrayList<>();
list.add(secondList[1]);
list.add(secondList[1]);
li.add(list);
}else{
list = new ArrayList<>();
list.add(firstList[1]);
list.add(firstList[1]);
li.add(list);
}
}
}
return li;
}
}