leetcodeマージ区間-アルゴリズム詳細解析コメント付き
2232 ワード
区間の集合を指定します.重複するすべての区間をマージしてください.
例1:
例2:
アルゴリズムの説明:
1、まずソートし、区間の開始startに基づいてソートしなければならない.Collectionsを呼び出す.sort(集合,new Comparetor{実装startをサイズ比較})実装.
2、秩序ある区間集合があれば、各区間を巡ることができます.エンキュー対象の基準区間(最初は最初の区間)を定義し、現在遍歴している区間のstartがエンキュー対象基準区間end以下であるかどうかを比較します.もしそうなら、この2つの区間を統合して、基準区間のendを修正することができます.そうでなければ、このエンキュー対象の基準区間は、結果キューに直接追加され、エンキュー対象の基準区間が遍歴したばかりの区間に更新されます.
例1:
: [[1,3],[2,6],[8,10],[15,18]]
: [[1,6],[8,10],[15,18]]
: [1,3] [2,6] , [1,6].
例2:
: [[1,4],[4,5]]
: [[1,5]]
: [1,4] [4,5] 。
アルゴリズムの説明:
1、まずソートし、区間の開始startに基づいてソートしなければならない.Collectionsを呼び出す.sort(集合,new Comparetor{実装startをサイズ比較})実装.
2、秩序ある区間集合があれば、各区間を巡ることができます.エンキュー対象の基準区間(最初は最初の区間)を定義し、現在遍歴している区間のstartがエンキュー対象基準区間end以下であるかどうかを比較します.もしそうなら、この2つの区間を統合して、基準区間のendを修正することができます.そうでなければ、このエンキュー対象の基準区間は、結果キューに直接追加され、エンキュー対象の基準区間が遍歴したばかりの区間に更新されます.
public class MergeInterval {
public class Interval {
int start;
int end;
Interval() {
start = 0;
end = 0;
}
Interval(int s, int e) {
start = s;
end = e;
}
}
/**
* , ,
*/
public List merge(List intervals) {
if (intervals == null) {
throw new IllegalArgumentException("this intervals list is null");
}
if (intervals.size() <= 1) {
return intervals;
}
//
Collections.sort(intervals, new Comparator() {
@Override
public int compare(Interval o1, Interval o2) {
return o1.start - o2.start;
}
});
//
List result = new LinkedList<>();
// start 、end, ,
int start = intervals.get(0).start;
int end = intervals.get(0).end;
for (Interval i : intervals) {//
if (i.start <= end) {// ,
end = Math.max(end, i.end);// , ,
} else {// ,
result.add(new Interval(start, end));
start = i.start;// ,
end = i.end;
}
}
Interval interval = new Interval(start, end);//
result.add(interval);
return result;
}
}