mirror of
https://github.com/halfrost/LeetCode-Go.git
synced 2025-07-24 10:37:33 +08:00
58 lines
1.1 KiB
Go
58 lines
1.1 KiB
Go
package leetcode
|
|
|
|
import "sort"
|
|
|
|
type job struct {
|
|
startTime int
|
|
endTime int
|
|
profit int
|
|
}
|
|
|
|
func jobScheduling(startTime []int, endTime []int, profit []int) int {
|
|
jobs, dp := []job{}, make([]int, len(startTime))
|
|
for i := 0; i < len(startTime); i++ {
|
|
jobs = append(jobs, job{startTime: startTime[i], endTime: endTime[i], profit: profit[i]})
|
|
}
|
|
sort.Sort(sortJobs(jobs))
|
|
dp[0] = jobs[0].profit
|
|
for i := 1; i < len(jobs); i++ {
|
|
low, high := 0, i-1
|
|
for low < high {
|
|
mid := low + (high-low)>>1
|
|
if jobs[mid+1].endTime <= jobs[i].startTime {
|
|
low = mid + 1
|
|
} else {
|
|
high = mid
|
|
}
|
|
}
|
|
if jobs[low].endTime <= jobs[i].startTime {
|
|
dp[i] = max(dp[i-1], dp[low]+jobs[i].profit)
|
|
} else {
|
|
dp[i] = max(dp[i-1], jobs[i].profit)
|
|
}
|
|
}
|
|
return dp[len(startTime)-1]
|
|
}
|
|
|
|
func max(a int, b int) int {
|
|
if a > b {
|
|
return a
|
|
}
|
|
return b
|
|
}
|
|
|
|
type sortJobs []job
|
|
|
|
func (s sortJobs) Len() int {
|
|
return len(s)
|
|
}
|
|
func (s sortJobs) Less(i, j int) bool {
|
|
if s[i].endTime == s[j].endTime {
|
|
return s[i].profit < s[j].profit
|
|
}
|
|
return s[i].endTime < s[j].endTime
|
|
}
|
|
func (s sortJobs) Swap(i, j int) {
|
|
s[i], s[j] = s[j], s[i]
|
|
}
|