Leetcode Java Number of Flowers in Full Bloom
업데이트:
문제
코드
class Solution {
public int[] fullBloomFlowers(int[][] flowers, int[] people) {
int length = flowers.length;
int[] start = new int[length];
int[] end = new int[length];
for (int i = 0; i < length; i++) {
start[i] = flowers[i][0];
end[i] = flowers[i][1];
}
Arrays.sort(start);
Arrays.sort(end);
length = people.length;
int[] result = new int[length];
for (int i = 0; i < length; i++) {
result[i] = this.getIndex(start, people[i] + 1) - this.getIndex(end, people[i]);
}
return result;
}
private int getIndex(int[] flowers, int target) {
int left = 0;
int right = flowers.length - 1;
while (left < right) {
int mid = left + (right - left) / 2;
if (flowers[mid] < target) {
left = mid + 1;
} else {
right = mid;
}
}
return flowers[left] >= target ? left : left + 1;
}
}
결과
설명
- people의 위치에 도달할 때 flowers의 개화된 꽃의 갯수를 반환하는 문제이다.
- flowers[i] = [starti, endi]로, 개화와 낙화의 지점이 저장되어 있다.
- 문제 풀이에 필요한 변수를 정의한다.
- length는 flowers의 길이를 저장한 변수이다.
- start와 end는 flowers의 꽃의 개화 시기와 낙화 시기를 넣을 배열로, 각각 length 크기의 정수 배열로 초기화하여 flowers를 이용하여 꽃의 개화와 낙화 지점를 넣고 오름차순 정렬해준다.
- start와 end를 오름차순으로 정렬하더라도 각 위치에서 개화된 꽃의 수는 변함이 없다.
- length에 people의 길이를 저장해준다.
- result는 결과를 저장할 변수로, length 길이의 정수 배열로 초기화한다.
- 0부터 length 미만까지 i를 증가시키며 아래를 반복한다.
- result[i] 위치에 4번에서 정의한 getIndex(int[] flowers, int target) 메서드를 start, $people[i] + 1$로 수행한 결과와 end, people[i]로 수행한 결과의 차잇값인 개화된 꽃의 수를 넣어준다.
- flowers의 target 위치에서 개화된 꽃의 시작과 종료 위치를 탐색하기 위한 getIndex(int[] flowers, int target) 메서드를 정의한다.
- left와 right는 위치 탐색에 필요한 변수로, 0과 $flowers.length - 1$로 초기화한다.
- left가 right 미만일 때 까지 아래를 반복한다.
- mid에 $left + \frac{right - left}{2}$인 중앙값을 넣어준다.
- flowers[mid]가 target 미만인 경우, left에 $mid + 1$을 넣어 하한 범위를 높혀준다.
- 위의 경우가 아니라면, right에 mid를 넣어 상한 범위를 낮혀준다.
- flowers[left]의 값이 target 이상이면 left를 아니면 $left + 1$를 반환한다.
- 반복이 완료되면 위치 별 개화된 꽃의 수가 저장된 result를 주어진 문제의 결과로 반환한다.
소스
Sample Code는 여기에서 확인 가능합니다.
댓글남기기