218. Java의 Leetcode 솔루션
14903 단어 java
class Solution {
public List<List<Integer>> getSkyline(int[][] buildings) {
final int n = buildings.length;
if (n == 0)
return new ArrayList<>();
if (n == 1) {
final int left = buildings[0][0];
final int right = buildings[0][1];
final int height = buildings[0][2];
List<List<Integer>> ans = new ArrayList<>();
ans.add(new ArrayList<>(Arrays.asList(left, height)));
ans.add(new ArrayList<>(Arrays.asList(right, 0)));
return ans;
}
List<List<Integer>> leftSkyline = getSkyline(Arrays.copyOfRange(buildings, 0, n / 2));
List<List<Integer>> rightSkyline = getSkyline(Arrays.copyOfRange(buildings, n / 2, n));
return merge(leftSkyline, rightSkyline);
}
private List<List<Integer>> merge(List<List<Integer>> left, List<List<Integer>> right) {
List<List<Integer>> ans = new ArrayList<>();
int i = 0; // left's index
int j = 0; // right's index
int leftY = 0;
int rightY = 0;
while (i < left.size() && j < right.size())
// choose the point with smaller x
if (left.get(i).get(0) < right.get(j).get(0)) {
leftY = left.get(i).get(1); // update the ongoing leftY
addPoint(ans, left.get(i).get(0), Math.max(left.get(i++).get(1), rightY));
} else {
rightY = right.get(j).get(1); // update the ongoing rightY
addPoint(ans, right.get(j).get(0), Math.max(right.get(j++).get(1), leftY));
}
while (i < left.size())
addPoint(ans, left.get(i).get(0), left.get(i++).get(1));
while (j < right.size())
addPoint(ans, right.get(j).get(0), right.get(j++).get(1));
return ans;
}
private void addPoint(List<List<Integer>> ans, int x, int y) {
if (!ans.isEmpty() && ans.get(ans.size() - 1).get(0) == x) {
ans.get(ans.size() - 1).set(1, y);
return;
}
if (!ans.isEmpty() && ans.get(ans.size() - 1).get(1) == y)
return;
ans.add(new ArrayList<>(Arrays.asList(x, y)));
}
}
리트코드
도전
문제에 대한 링크는 다음과 같습니다.
https://leetcode.com/problems/the-skyline-problem/
Reference
이 문제에 관하여(218. Java의 Leetcode 솔루션), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://dev.to/chiki1601/218-leetcode-solution-in-java-33bk
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
문제에 대한 링크는 다음과 같습니다.
https://leetcode.com/problems/the-skyline-problem/
Reference
이 문제에 관하여(218. Java의 Leetcode 솔루션), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/chiki1601/218-leetcode-solution-in-java-33bk텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)