文章目录
刷题前唠嗑
LeetCode?启动!!!
题目:出租车的最大盈利
题目链接:2008. 出租车的最大盈利
题目描述
代码与解题思路
go
func maxTaxiEarnings(n int, rides [][]int) int64 {
type pair struct{ s, p int } // 一个存上车点, 一个存盈利
group := make([][]pair, n+1)
for _, r := range rides {
start, end, tip := r[0], r[1], r[2]
group[end] = append(group[end], pair{start, end-start+tip}) // 根据 end 存 pair
}
dp := make([]int64, n+1)
for i := 2; i <= n; i++ {
dp[i] = dp[i-1] // 填 dp 数组, 无论有没有更改, 都先把上一个最大盈利继承一下
for _, v := range group[i] {
dp[i] = max(dp[i], dp[v.s]+int64(v.p)) // 遍历所有 end 为 i 的情况的最大盈利
}
}
return dp[n]
}
核心思路在于,记录样例中相同 end 的乘客的情况,然后遍历求出最大盈利的情况更新 dp 数组。
还有一种解法是,先 sort 一下,然后根据相同 start 的乘客的情况,然后用也是老办法用 dp 求解,通过 二分/优先级队列(堆) 来优化 dp,具体我就不 CV 了,摆了