Leetcode2008. 出租车的最大盈利

0动态规划+二分查找中等 LeetCode2008. 出租车的最大盈利 动态规划+二分查找中等 阅读详情

Every day a Leetcode

题目来源:2008. 出租车的最大盈利

解法1:排序 + 二分查找 + 动态规划

将数组 rides 按照 endi 从小到大进行排序,记 m 为 rides 的大小,dp1 表示只接区间 [0,i] 内的乘客的最大盈利,显然 dp0 = 0,而对于 i∈[0,m],有两种情况:

  • 对第 i 位乘客接单:由于前面已经对数组 rides 排序,因此我们可以通过二分查找来找到满足 endj ≤ starti 最大的 j,那么,设 earningi-1 = rides[i - 1][1] - rides[i - 1][0] + rides[i - 1][2],有 dp[i] = max(dp[i - 1], dp[j] + earning)。
  • 不对第 i 位乘客接单:dp[i] = dp[i-1]。

于是,我们得到了状态转移方程:dp[i] = max(dp[i - 1], dp[j] + earning)。

代码:

/*
 * @lc app=leetcode.cn id=2008 lang=cpp
 *
 * [2008] 出租车的最大盈利
 */

// @lc code=start
class Solution
{
private:
    // 对数组 rides 按 end 从小到大排序
    static bool cmp(const vector<int> &ride1, const vector<int> &ride2)
    {
        return ride1[1] < ride2[1];
    }

public:
    long long maxTaxiEarnings(int n, vector<vector<int>> &rides)
    {
        // 特判
        if (n == 0 || rides.empty())
            return 0;
        sort(rides.begin(), rides.end(), cmp);
        int m = rides.size();
        // dp[i]: 接区间 [0, i] 内的乘客的最大盈利
        vector<long long> dp(m + 1, 0);
        // 初始化
        dp[0] = 0;
        // 状态转移
        for (int i = 1; i <= m; i++)
        {
            int j = upper_bound(rides.begin(), rides.begin() + i - 1, rides[i - 1][0], [](int x, const vector<int> &r) -> bool
                                { return x < r[1]; }) -
                    rides.begin();
            int earning = rides[i - 1][1] - rides[i - 1][0] + rides[i - 1][2];
            dp[i] = max(dp[i - 1], dp[j] + earning);
        }
        return dp[m];
    }
};
// @lc code=end

结果:

在这里插入图片描述

复杂度分析:

时间复杂度:O(mlogm),其中 m 是数组 rides 的长度。一次二分查找需要 O(log⁡m) 的时间,共进行 m 次二分查找,总计的时间复杂度为 O(mlogm)。

空间复杂度:O(m),其中 m 是数组 rides 的长度。

解法2:动态规划 + 哈希表

使用哈希表 rideMap[end] 记录终点为 end 的所有乘客信息。不同于解法 1,我们使用 dp[i] 表示到达第 i 个地点时,能获取的最大盈利,显然有 dp[0] = 0,而对于 i∈[1,n],有两种情况:

  1. 选择一个终点为第 i 个地点的乘客 j:设这次盈利 earning = endj - startj + tipj,那么最大盈利为 dp[i] = dp[startj] + earning。
  2. 没有乘客在第 i 个地点下车:dp[i] = dp[i-1]。

于是,我们得到了状态转移方程:dp[i] = max(dp[i - 1], max(dp[startj] + endj - startj + tipj)。

注意,因为 unordered_map 内部是由哈希表实现的,哈希表中的每一项为一个桶,分别装着键和值,原 STL 中不包含 pair<int,int> 类型的键,不能够直接使用嵌套到哈希表中,所以需要自定义哈希值与判断相等函数。

代码:

// 哈希表 + 动态规划

class Solution
{
public:
    long long maxTaxiEarnings(int n, vector<vector<int>> &rides)
    {
        // 特判
        if (n == 0 || rides.empty())
            return 0;
        unordered_map<int, vector<vector<int>>> rideMap; //<end, {start, tip}>
        for (const vector<int> &ride : rides)
        {
            int start = ride[0], end = ride[1], tip = ride[2];
            rideMap[end].push_back({start, tip});
        }
        // dp[i]: 到达第 i 个地点时能获取的最大盈利
        vector<long long> dp(n + 1, 0);
        // 初始化
        dp[0] = 0;
        // 状态转移
        for (int i = 1; i <= n; i++)
        {
            dp[i] = max(dp[i], dp[i - 1]);
            for (vector<int> &ride : rideMap[i])
            {
                int start = ride[0], end = i, tip = ride[1];
                int earning = end - start + ride[1];
                dp[i] = max(dp[i], dp[start] + earning);
            }
        }
        return dp[n];
    }
};

结果:

在这里插入图片描述

复杂度分析:

时间复杂度:O(m+n),其中 m 是数组 rides 的长度,n 是地点的数量。动态规划转移需要 O(n) 的时间,查询乘客信息需要 O(m) 的时间。

空间复杂度:O(m+n),其中 m 是数组 rides 的长度,n 是地点的数量。动态规划需要保存 n 个状态,哈希表需要保存 m 个乘客信息。

【Unity+HoloLens2】从0开始在HoloLens2部署MR工程 HoloLens2部署的权威教程在微软的官方文档中,但有些问题其实官方文档并没有列出,所以在实际开发过程中如果遇到bug,就需要自身或者前人的经验去解决。比如:对于Hololens2来说,在VS中需选择ARM64而不是x86。部署需要有良好的网速;工程打包出来的文件路径和工程路径有关联,如果这两个路径不匹配,部署就会失败。部署后打不开可能是因为Unity中未添加需要部署的场景,在Build Settings中点击Add open Scenes。... 阅读详情

相关推荐

避开地图定位偏差!手把手教你用Python实现火星坐标与WGS84精准转换

本文深入解析了国内地图服务中火星坐标(GCJ-02)与国际标准WGS84坐标系之间的偏差问题,并提供了基于Python的精准转换解决方案。文章详细阐述了坐标转换的核心原理,手把手教你构建可复用的转换工具包,并演示如何将其集成到实际应用(如Flask API)中,帮助开发者和数据分析师有效解决地图定位不准、多源数据无法对齐的痛点,提升地理信息处理能力。

weixin_29250403的博客 126

【LeetCode】每日一题:出租车的最大盈利——2023.12.8

这是一个最优化问题,在每一个乘客处,你有接和不接两种选择,若将乘车信息数组按照下车顺序进行升序排列,你将发现这个优化问题无后效性(你在接第i位乘客时,你所能获得的最大利益只和第j位乘客(目的地刚好在第i位乘客上车之前下车的乘客)那里所获得的最大利益相关,而和第j位乘客之前的那些乘客无关),可以看出可以采用动态规划进行解题;状态转义方程:dp[i] = max(dp[i - 1], dp[j] + rides[i][1] - rides[i][0] + rides[i][2])

m0_64067123的博客 360

我用两个月时间,终于把优快云付费资源项目玩明白了!

关于项目的定位,这是一个知识付费项目,根据市场研究机构的数据显示,到2023年,全球知识付费市场规模将达到2000亿美元,所以说知识付费的前景是十分广阔的,当下互联网时代信息大爆炸,80后、90后、00后群体对知识付费的认可度也大幅提升,同时这群作为知识付费的主流人群已经具备了更强的消费能力,而且对于知识付费的需求更高。目前整个知识付费领域仍然在发展起步的初期,尽快在知识付费领域布局可以帮助我们在这波红利中获得一份不错的收益。而且个人认为,

白话机器学习 2万+

力扣(LeetCode)2008. 出租车的最大盈利(C语言)

[墨染] 经典动态规划。时空双百。

墨染 727

2021秋招IC验证面经-ARM中国/中科芯/飞腾/地平线/中兴

中科芯 (央企福利待遇好,但是百分百不解决户口,适合当地人进去躺平。) 现场面试,三个面试官,时间大约40min 首先介绍一下自己,介绍一下项目。所做项目用到了FIFO吗,深度是多少,位宽是多少,仲裁算法是什么? 验证环境中的reference model是自己写的还是本身就有的,仲裁怎么在参考模型中实现,参考模型怎么获取寄存器的值? 怎么配置RTL寄存器,通过平台的寄存器模型进行寄存器配置,寄存器模型里边的方法,写一个寄存器或读一个寄存器怎么实现? 寄存器如何实现前门访问和后门访问,后门访问时

weixin_48014653的博客 6323

eLabRadio软件无线电虚实结合仿真开发平台简介

在使用仿真平台时,不要关闭设备或断开设备与PC机之间的网络连接,否则,仿真平台将无法正常工作。注:采用eNodeX设备认证方式,当出现“设备不存在”的报错时,请检查计算机IP是否和硬件设备IP处于同一网段,或者是否是先连接好网线,再开启硬件设备的。①此登录方式下,需要先建立软件与硬件的通信:在登录窗口点击【网络配置】,参照下图输入设备IP,服务器地址无需设置,设置完成后点击确认,此时登录界面无需设置账号密码;,拷贝到电脑上,使用管理员权限运行setup.exe,下一步直到安装完成,桌面会生成快捷方式。

weixin_55349105的博客 6320

每日刷题计划之LC每日一题Day[14, 25]

题源:LeetCode Day14:1219. 黄金矿工 你要开发一座金矿,地质勘测学家已经探明了这座金矿中的资源分布,并用大小为 m * n 的网格 grid 进行了标注。每个单元格中的整数就表示这一单元格中的黄金数量;如果该单元格是空的,那么就是 0。 为了使收益最大化,矿工需要按以下规则来开采黄金: 每当矿工进入一个单元,就会收集该单元格中的所有黄金。 矿工每次可以从当前位置向上下左右四个方向走。 每个单元格只能被开采(进入)一次。 不得开采(进入)黄金数目为 0 的单元格。 矿工可以从网格中 任意

布屿 590

智能手环嵌入式系统:STM32+ESP8266多传感器健康监护设计

可穿戴健康监测设备是物联网与边缘计算融合的典型应用,其核心在于多源生理信号采集、低功耗实时处理及安全云协同。基于光电容积脉搏波(PPG)的心率与血氧检测、NTC热敏电阻体温测量、加速度-角速度融合跌倒判据等技术,构成了老年健康监护的基础感知能力;而STM32主控与ESP8266协处理器分工架构,则实现了计算资源与通信负载的高效解耦。该方案依托FreeRTOS多任务调度、阿里云IoT物模型标准化交互及MQTT双向通信,兼顾实时性、可靠性和工程可维护性,广泛适用于居家养老、慢病管理与远程健康预警等场景。

weixin_33256096的博客 101

Leetcode题解(超赞!!!)

我是技术搬运工,好东西当然要和大家分享啦.原文地址算法思想二分查找二分查找思想简单,但是在实现时有一些需要注意的细节:在计算 mid 时不能使用 mid = (l + h) / 2 这种方式,因为 l + h 可能会导致加法溢出,应该使用 mid = l + (h - l) / 2。对 h 的赋值和循环条件有关,当循环条件为 l &lt;= h 时,h = mid - 1;当循环条件为 l &lt...

FanceFu的博客 2万+

Python爬虫模拟登录京东并抓取商品数据

京东是一个拥有海量商品数据的电子商务平台。作为爬虫开发者,能够抓取这些数据将为我们提供很多机会进行数据分析、价格预测、市场调研等工作。然而,京东的反爬虫机制非常强大,包括但不限于验证码、动态加载页面、IP封禁等。因此,想要通过Python爬虫抓取京东的数据并不容易。在本文中,我们将从分析京东的登录机制开始,逐步介绍如何使用Python中的各种工具,如。

2201_76125261的博客 1831

AgentScope 2.0 API完全指南:构建企业级AI智能体应用的技术实践

本文系统梳理AgentScope 2.0框架的完整API体系,涵盖智能体核心引擎、统一模型适配层、工具系统、消息协议、权限控制与工作空间管理等七大核心模块。通过深入的源码级分析与架构图示,详细解读Agent类的推理-行动循环、ChatModelBase的多模型抽象、Toolkit的工具管理机制、ContentBlock的多模态内容表达、PermissionEngine的安全决策流程,以及Local/Docker/E2B三种工作空间实现。文章还提供了智能客服系统的完整实战案例,展示从自定义工具开发到流式服务部

program哲学 483

LeetCode 2008

artienditipirides[i]=[starti​,endi​,tipi​] 表示第 i 位乘客需要从地点 starti 前往 endi ,愿意支付 tipi 元的小费。每一位 你选择接单的乘客 i ,你可以 盈利endi−startitipiendi​−starti​+tipi​ 元。你同时 最多 只能接一个订单。给你 n 和 rides ,请你返回在最优接单方案下,你能盈利 最多 多少元。

2501_90252650的博客 471

第十二天:Python字典(Dict)详解

字典(Dictionary)是Python中最强大的数据类型之一,它是一种可变的、无序的键值对(key-value)集合。字典中的元素是通过键(key)来存取的,而不是通过偏移量(如列表中的索引)。 字典的核心特性包括: 键值对结构:每个元素由一个键和一个值组成,中间用冒号(:)分隔 无序性:字典中的元素没有固定的顺序(Python 3.7+版本中字典会保持插入顺序,但不应依赖此特性进行顺序操作) 可变性:可以动态地添加、修改或删除键值对 键的唯一性:字典中的键必须是唯一的,如果重复,后面的键值对会覆盖

本博客聚焦 YOLOv11 全流程落地,涵盖架构优化、数据集处理、训练技巧与多场景部署,兼及国产数据库、Java 开发与 AI 模型应用,内容兼顾理论与工程实践,为开发者提供系统干货,助力高效提升技术能力。 1681

LeetCode-2008. 出租车的最大盈利

你驾驶出租车行驶在一条有 个地点的路上。这 个地点从近到远编号为 到 ,你想要从 开到 ,通过接乘客订单盈利。你只能沿着编号递增的方向前进,不能改变方向。乘客信息用一个下标从 0 开始的二维数组 表示,其中 表示第 位乘客需要从地点 前往 ,愿意支付 元的小费。每一位 你选择接单的乘客 ,你可以 盈利 元。你同时 最多 只能接一个订单。给你 和 ,请你返回在最优接单方案下,你能盈利 最多 多少元。注意:你可以在一个地点放下一位乘客,并在同一个地点接上另一位乘客。预处理:将所有

qq_45931691的博客 568

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Leetcode—2008.出租车的最大盈利【中等】

Leetcode—2008.出租车的最大盈利【中等】

Atticus的博客 273

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

Leetcode.2008 出租车的最大盈利

输入:n = 20, rides = [[1,6,1],[3,10,2],[10,12,3],[11,12,2],[12,15,2],[13,18,1]]解释:我们可以接乘客 0 的订单,获得 5 - 2 + 4 = 7 元。输入:n = 5, rides = [[2,5,4],[1,5,1]],通过接乘客订单盈利。你只能沿着编号递增的方向前进,不能改变方向。注意:你可以在一个地点放下一位乘客,并在同一个地点接上另一位乘客。,请你返回在最优接单方案下,你能盈利。个地点从近到远编号为。,所能盈利的最大金额。

感觉画质不如...原神的博客 233

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

力扣每日一题:2008. 出租车的最大盈利(2023-12-08)

力扣每日一题:2008. 出租车的最大盈利(2023-12-08)

474

【划分型DP】力扣2008. 出租车的最大盈利

乘客信息用一个下标从 0 开始的二维数组 rides 表示,其中 rides[i] = [starti, endi, tipi] 表示第 i 位乘客需要从地点 starti 前往 endi ,愿意支付 tipi 元的小费。输入:n = 20, rides = [[1,6,1],[3,10,2],[10,12,3],[11,12,2],[12,15,2],[13,18,1]],其中 m 是 rides 的长度,n 是地点数目。输入:n = 5, rides = [[2,5,4],[1,5,1]]

sjsjs11的博客 584

​LeetCode解法汇总2008. 出租车的最大盈利

将乘客 2 从地点 10 送往地点 12 ,获得 12 - 10 + 3 = 5 元。- 将乘客 5 从地点 13 送往地点 18 ,获得 18 - 13 + 1 = 6 元。- 将乘客 1 从地点 3 送往地点 10 ,获得 10 - 3 + 2 = 9 元。我们可以接乘客 0 的订单,获得 5 - 2 + 4 = 7 元。dp[i]代表到第i的位置,出租司机最大的收益。第二种,dp[from]的收益,加上到第i的位置订单的最大收益。你可以在一个地点放下一位乘客,并在同一个地点接上另一位乘客。

分享+记录 288

LeetCode 2008. 出租车的最大盈利(DP)

文章目录1. 题目2. 解题 1. 题目 你驾驶出租车行驶在一条有 n 个地点的路上。 这 n 个地点从近到远编号为 1 到 n ,你想要从 1 开到 n ,通过接乘客订单盈利。 你只能沿着编号递增的方向前进,不能改变方向。 乘客信息用一个下标从 0 开始的二维数组 rides 表示,其中 rides[i] = [starti, endi, tipi] 表示第 i 位乘客需要从地点 starti 前往 endi ,愿意支付 tipi 元的小费。 每一位 你选择接单的乘客 i ,你可以 盈利 endi - s

Michael是个半路程序员 987

【算法思考记录】力扣2008. 出租车的最大盈利【C++,动态规划,记忆化搜索】

定义一个递归函数。

未来就在脚下。 464

LeetCode每日一题:2008. 出租车的最大盈利

DP + 哈希表

weixin_41672471的博客 584

LeetCode 2008. 出租车的最大盈利:动态规划 + 哈希表

LeetCode 2008. 出租车的最大盈利:动态规划 + 哈希表 你驾驶出租车行驶在一条有 n 个地点的路上。这 n 个地点从近到远编号为 1 到 n ,你想要从 1 开到 n ,通过接乘客订单盈利。你只能沿着编号递增的方向前进,不能改变方向。 乘客信息用一个下标从 0 开始的二维数组 rides 表示,其中 rides[i] = [starti, endi, tipi] 表示第 i 位乘客需要从地点 starti 前往 endi ,愿意支付 tipi 元的小费。 每一位 你选择接单的乘客 i ,你

<font color="Pink">Tisfy的博客</font> 1091

动态规划:LeetCode2008. 出租车的最大盈利

2008. 出租车的最大盈利你驾驶出租车行驶在一条有n个地点的路上。这n个地点从近到远编号为1到n,你想要从1开到n,通过接乘客订单盈利。你只能沿着编号递增的方向前进,不能改变方向。乘客信息用一个下标从0开始的二维数组rides表示,其中rides[i] = [starti, endi,...

weixin_36959942的博客 112

LeetCode:2008. 出租车的最大盈利(dp C++)

先将乘客按照end排序,二分, 找出end小于等于此区间start的编号最后的区间,用 j 来表示。

Cosmoshhhyyy的博客 235

LeetCode 2008. 出租车的最大盈利(背包DP)

如此的话,与经典的背包dp问题不同的是,我们可以把 rides 数组根据 end 的大小进行排序,同时不断维护 rides 中 end 的最大值始终大于当前地点 i,这样我们只需要不断从排序后的 rides 数组的一端取出用于决策的 ride,而无需像经典背包dp一样每次决策都遍历所有“商品”。在代码实现之前,我们可以先确定一下dp的状态转移方程。输入:n = 20, rides = [[1,6,1],[3,10,2],[10,12,3],[11,12,2],[12,15,2],[13,18,1]]

做一做笔记,做一做总结 307
上一篇: 剑指 Offer(第2版)面试题 20:表示数值的字符串
下一篇: 剑指 Offer(第2版)面试题 30:包含 min 函数的栈
UestcXiye
博客等级 码龄8年 9032粉丝 1306原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

UestcXiye

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值