이분탐색
https://leetcode.com/problems/maximum-profit-in-job-scheduling/description/
class Solution {
public int jobScheduling(int[] startTime, int[] endTime, int[] profit) {
int n = startTime.length;
Job[] jobs = new Job[n];
for(int i=0; i<n; i++) {
jobs[i] = new Job(startTime[i], endTime[i], profit[i]);
}
Arrays.sort(jobs);
int[] mem = new int[n];
mem[0] = jobs[0].p;
for(int i=1; i<n; i++) {
int curProfit = jobs[i].p;
int preIdx = findLastNonOverlappingJob(jobs, i);
// 겹치지 않는 Job이 존재하는 경우
if(preIdx != -1) {
curProfit += mem[preIdx];
}
mem[i] = Math.max(mem[i-1], curProfit);
}
return mem[n-1];
}
private int findLastNonOverlappingJob(Job[] jobs, int curIdx) {
int left = 0;
int right = curIdx - 1;
while(left<=right) {
int mid = left + (right-left)/2;
// 다음 인덱스도 겹치지 않는 경우 -> 겹치지 않는 최대 인덱스를 찾아야 함
if(jobs[curIdx].s >= jobs[mid + 1].e) {
left = mid + 1;
}
// 겹치지 않는 마지막 인덱스인 경우
else if(jobs[curIdx].s >= jobs[mid].e) {
return mid;
}
else {
right = mid - 1;
}
}
return -1;
}
static class Job implements Comparable<Job> {
int s;
int e;
int p;
public Job(int s, int e, int p) {
this.s = s;
this.e = e;
this.p = p;
}
@Override
public int compareTo(Job j) {
return this.e - j.e;
}
}
}
static class Job implements Comparable<Job> {
int s;
int e;
int p;
public Job(int s, int e, int p) {
this.s = s;
this.e = e;
this.p = p;
}
@Override
public int compareTo(Job j) {
return this.e - j.e;
}
}
for(int i=1; i<n; i++) {
int curProfit = jobs[i].p;
int preIdx = findLastNonOverlappingJob(jobs, i);
// 겹치지 않는 Job이 존재하는 경우
if(preIdx != -1) {
curProfit += mem[preIdx];
}
mem[i] = Math.max(mem[i-1], curProfit);
}
private int findLastNonOverlappingJob(Job[] jobs, int curIdx) {
int left = 0;
int right = curIdx - 1;
while(left<=right) {
int mid = left + (right-left)/2;
// 다음 인덱스도 겹치지 않는 경우 -> 겹치지 않는 최대 인덱스를 찾아야 함
if(jobs[curIdx].s >= jobs[mid + 1].e) {
left = mid + 1;
}
// 겹치지 않는 마지막 인덱스인 경우
else if(jobs[curIdx].s >= jobs[mid].e) {
return mid;
}
else {
right = mid - 1;
}
}
return -1;
}
// 겹치지 않는 Job이 존재하는 경우
if(preIdx != -1) {
curProfit += mem[preIdx];
}
mem[i] = Math.max(mem[i-1], curProfit);
2시간