850. Rectangle Area II
내 안에 나 온 bug, TreeSet 과 List Of line 은 두 개의 서로 다른 비교 기 가 있 을 것 이다. 나 는 같은 것 을 사 용 했 고 bug 가 나 왔 다. 사실은 Segment Tree 로 도 할 수 있다.안 쓸 게 요.아래 의 이 해법 은 정말 훌륭 하 다.https://leetcode.com/problems/rectangle-area-ii/discuss/138028/Clean-Recursive-Solution-Java
class Solution {
public int rectangleArea(int[][] rectangles) {
List lineList = new ArrayList<>();
int i = 0;
for (int[] rect : rectangles) {
lineList.add(new Line(rect[0], rect, i));
lineList.add(new Line(rect[2], rect, i++));
}
Collections.sort(lineList, new Comparator(){
public int compare(Line o1, Line o2) {
return o1.x - o2.x;
}
});
TreeSet treeSet = new TreeSet<>();
Integer lastX = null;
int slow = 0, fast = 0;
long ans = 0;
while (fast < lineList.size()) {
int curX = lineList.get(fast).x;
treeSet.add(lineList.get(fast));
while (fast + 1 < lineList.size() && lineList.get(fast + 1).x == (curX)) {
treeSet.add(lineList.get(++fast));
}
if (lastX == null) {
lastX = curX;
} else {
ans += getArea(treeSet, curX, lastX);
ans %= 1000000007;
lastX = curX;
}
fast++;
}
return (int) ans;
}
private long getArea(TreeSet treeSet, int x2, int x1) {
List intervals = new ArrayList<>();
Iterator it = treeSet.iterator();
while(it.hasNext()) {
Line line = it.next();
if (line.start == x2) continue;
intervals.add(new Interval(line.low, line.hi));
if (line.end == x2) it.remove();
}
return (long) (x2 - x1) * ((long) mergeIntervalAndCombine(intervals));
}
private int mergeIntervalAndCombine(List list) {
int ans= 0;
Interval holder = null;
for (Interval itv : list) {
if (holder == null) {
holder = new Interval(itv.start, itv.end);
continue;
}
if (itv.start > holder.end) {
ans += holder.end - holder.start;
holder.start = itv.start;
holder.end = itv.end;
} else {
holder.end = Math.max(holder.end, itv.end);
}
}
if (holder != null) ans += holder.end - holder.start;
return ans;
}
}
class Interval {
int start, end;
public Interval(int start, int end) {
this.start = start;
this.end = end;
}
}
class Line implements Comparable {
int x;
int low, hi;
int start, end;
int id;
public Line(int x, int[] rec, int id) {
this.x = x;
this.low = rec[1];
this.hi = rec[3];
this.start = rec[0];
this.end = rec[2];
this.id = id;
}
@Override
public int compareTo(Line that) {
if (this.low != that.low) return this.low < that.low ? -1 : 1;
return this.id - that.id;
// id ,treeSet compare 0 entry !!
}
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.