2008. 出租车的最大盈利
题目地址(2008. 出租车的最大盈利)
https://leetcode-cn.com/problems/maximum-earnings-from-taxi/
题目描述
前置知识
动态规划
二分
公司
暂无
思路
这是一个典型的最长上升子序列(LIS)问题。如果你对最长上升子序列不熟悉,强烈建议先看一下我之前写的专题:https://lucifer.ren/blog/2020/06/20/LIS/
LIS 问题的常规做法是 $n^2$ , 而这道题的数据范围是 $10^5$, 这意味着我们使用平方的解法是无法通过的。关于这点不明白的可以看下我之前写的文章:https://lucifer.ren/blog/2020/12/21/shuati-silu3/
我们可以用动态规划来解, dp[i] 表示仅考虑 rides 0 到 i (左右闭合区间),所能挣的最多的钱。因此 dp[len(rides)-1] 就是答案。
那么状态如何转移呢?传统的 LIS 问题,对于每一个 j 我们都向前找到第一个满足 rides[j][0] >= rides[i][1] 的 i,我们需要两层循环枚举所有可能。那么如何优化呢?
实际上前面的文章也提到过,这里再次强调一下。由于我们需要向前找到第一个满足 rides[j][0] >= rides[i][1] 的 i,那么我们可以先对结束时间排序,接下来二分找到最右满足条件的 i,这样时间复杂度可以降低到 $nlogn$。 由于这是一个典型的最右满足条件的二分,我们直接使用模板解决。不熟悉二分的可以看下我的二分专题:https://lucifer.ren/blog/2021/03/08/binary-search-1/
由于我们是找满足条件的 dp[i][1] ,因此需要对结束时间而不是开始时间排序
关键点
二分优化时间复杂度
代码
语言支持:Python3
Python3 Code:
复杂度分析
令 n 为数组长度。
时间复杂度:$O(nlogn)$
空间复杂度:$O(n)$
此题解由 力扣刷题插件 自动生成。
力扣的小伙伴可以关注我,这样就会第一时间收到我的动态啦~
以上就是本文的全部内容了。大家对此有何看法,欢迎给我留言,我有时间都会一一查看回答。更多算法套路可以访问我的 LeetCode 题解仓库:https://github.com/azl397985856/leetcode 。 目前已经 40K star 啦。大家也可以关注我的公众号《力扣加加》带你啃下算法这块硬骨头。
关注公众号力扣加加,努力用清晰直白的语言还原解题思路,并且有大量图解,手把手教你识别套路,高效刷题。
最后更新于