2023-07-25:你驾驶出租车行驶在一条有 n 个地点的路上 这 n 个地点从近到远编号为 1 到 n ,你想要从 1 开到 n 通过接乘客订单盈利。你只能沿着编号递增的方向前进,不能改变方向 乘
2023-07-25:你驾驶出租车行驶在一条有 n 个地点的路上
这 n 个地点从近到远编号为 1 到 n ,你想要从 1 开到 n
通过接乘客订单盈利。你只能沿着编号递增的方向前进,不能改变方向
乘客信息用一个下标从 0 开始的二维数组 rides 表示
其中 rides[i] = [starti, endi, tipi]
表示第 i 位乘客需要从地点 starti 前往 endi
愿意支付 tipi 元的小费
每一位 你选择接单的乘客 i ,你可以 盈利 endi - starti + tipi 元
你同时 最多 只能接一个订单。
给你 n 和 rides ,请你返回在最优接单方案下,你能盈利 最多 多少元。
注意:你可以在一个地点放下一位乘客,并在同一个地点接上另一位乘客。
输入:n = 5, rides = [[2,5,4],[1,5,1]]。
输出:7。
答案 2023-07-25:
maxTaxiEarnings1 算法的大体过程如下:
1.对乘客订单 rides 按照起始地点的编号进行升序排序。
2.调用 build 函数,构建区间树数据结构,初始化 max 数组。
3.遍历排序后的 rides 数组,对每个乘客订单进行处理:
a.根据乘客订单的起始地点,通过 maxQuery 函数查询当前位置之前的最大盈利额,存储在 money 变量中。
b.计算当前乘客订单的盈利额,即 end-start+tip。
c.将当前乘客订单的结束地点作为索引,更新 max 数组中对应位置的值,更新为 money+当前乘客订单的盈利额。
4.返回 maxQuery 函数查询整个路程的最大盈利额,即 maxQuery(n)。
maxTaxiEarnings2 算法的大体过程如下:
1.初始化 sorted 数组,用于存储所有乘客订单的起始和结束地点,长度为乘客订单数量的两倍。
2.遍历 rides 数组,将乘客订单的起始和结束地点依次存储到 sorted 数组中。
3.对 sorted 数组进行升序排序。
4.对乘客订单 rides 按照起始地点的编号进行升序排序。
5.初始化 dp 数组,并将所有元素置为 0。
6.初始化 dpi 变量为 0,用于记录当前处理到的 sorted 数组下标。
7.初始化 pre 和 ans 变量为 0。
8.遍历排序后的 rides 数组,对每个乘客订单进行处理:
a.获取当前乘客订单的起始和结束地点。
b.分别使用 rank 函数查找 sorted 数组中起始和结束地点的下标。
c.更新 dp 数组,从 dpi 到起始地点的下标之间的元素,将其值更新为 max(pre, dp[dpi])。
d.计算当前乘客订单的盈利额,即 end-start+tip。
e.更新 ans 变量,取盈利额和当前 ans 的最大值。
f.将 dp 数组中结束地点的下标位置的值更新为 max(dp[erank], 盈利额)。
9.返回 ans 变量,即最大盈利额。
这两种算法的核心思想都是通过动态规划来计算每个乘客订单的盈利额,并利用区间树或排序数组来快速查询之前的最大盈利额,从而得到整个路程的最大盈利额。
maxTaxiEarnings1 算法的总的时间复杂度为 O(nlogn),总的额外空间复杂度为 O(n)。
maxTaxiEarnings2 算法的总的时间复杂度为 O(nlogn),总的额外空间复杂度为 O(n)。
go 完整代码如下:
版权声明: 本文为 InfoQ 作者【福大大架构师每日一题】的原创文章。
原文链接:【http://xie.infoq.cn/article/cb9f04676bc884673a26c9e14】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。
评论