3439 - Reschedule Meetings for Maximum Free Time I
정보
- 문제 보기: 3439 - Reschedule Meetings for Maximum Free Time I
- 소요 시간: 21분 49초
- 풀이 언어:
java
- 체감 난이도: 3️⃣
- 리뷰 횟수: ✅
풀이 키워드
스포주의
그리디
슬라이딩 윈도우
풀이 코드
정보
- 메모리: 60960 KB
- 시간: 1 ms
class Solution {
public int maxFreeTime(int eventTime, int k, int[] startTime, int[] endTime) {
int n = startTime.length; // number of events
int[] gap = new int[n+1]; // n+1 gaps exist for n events
// calc gaps
gap[0] = startTime[0];
gap[n] = eventTime - endTime[n-1];
for (int i = 1; i < n; ++i) {
gap[i] = startTime[i] - endTime[i-1];
}
// select k events -> k+1 gaps available
int sdx = 0, edx = k;
int sum = 0;
for (int i = 0; i < k+1; ++i) {
sum += gap[i]; // init sum
}
// sliding window
int ans = sum;
while (edx < n) {
sum -= gap[sdx++];
sum += gap[++edx];
ans = ans < sum ? sum : ans;
}
return ans;
}
}
풀이 해설
eventTime
은 최대 , n
은 최대 라서 무지성 은 안된다.
그래서 좀 더 효율적인거 없나 하고 고민해보자면
k개의 미팅을 선택해서 가질 수 있는 최대 영역(이하 가용 영역)에서, 상대 순서를 지킨 채 어떻게 미팅들을 재배치하든
결국 빈 공간의 총합은 같음을 떠올려볼 수 있다.
예를 들어 상단과 같은 예제에서는, 3개의 미팅을 선택했을 때
이렇게 배치하든
아님 이렇게 딱맞게 배치하든 남은 공간의 총합은 어차피 6으로 동일하다.
그래서 미팅을 직접 재배치하는 시뮬레이션, 완탐, DP 등의 유형은 후보에서 제외된다.