当前位置: 首页 > news >正文

leetcode 1235

leetcode 1235

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

代码

class Solution {
public:int jobScheduling(vector<int>& startTime, vector<int>& endTime, vector<int>& profit) {int n = startTime.size();vector<vector<int>> jobs(n);for(int i=0; i<n; i++){jobs[i] = {startTime[i], endTime[i], profit[i]};}sort(jobs.begin(), jobs.end(), [](const vector<int>&job1, const vector<int>&job2){return job1[1] < job2[1]; });vector<int> dp(n+1);for(int i=1; i<=n; i++){//找到结束时间大于i-th job的开始时间的job id, 因为是有序的,所以id 可以转为对应的job数量, dp[2th job] 表示前两个job的最优解答,局部最优成为全局最优解答int k = upper_bound(jobs.begin(), jobs.begin()+i-1, jobs[i-1][0], [](int st, vector<int>& job){return st < job[1];}) - jobs.begin();dp[i] = max(dp[i-1], dp[k] + jobs[i-1][2]);}return dp[n];}
};

例子

在这里插入图片描述
遍历已经排序过的jobs, dp[0] =0;
1,3,20, -> dp[1] = 20
2,3,50 -> dp[2] = 50
4,6,70 -> dp[3] = dp[2] + 70 = 120
6,9,60 -> dp[4] = dp[3] + 60 = 180
3,10,100 -> dp[5] = max (dp[4], dp[2] +100) =180

upper_bound

std::upper_bound 函数在 C++ 标准库 <algorithm> 头文件中定义。以下是一个可能的实现:

template<class ForwardIt, class T, class Compare>
ForwardIt upper_bound(ForwardIt first, ForwardIt last, const T& value, Compare comp)
{ForwardIt it;typename std::iterator_traits<ForwardIt>::difference_type count, step;count = std::distance(first, last);while (count > 0) {it = first;step = count / 2;std::advance(it, step);if (!comp(value, *it)) {first = ++it;count -= step + 1;} else {count = step;}}return first;
}

这段代码展示了 std::upper_bound 的基本工作原理。它采用了二分查找的方法,在已排序的范围 [first, last) 中查找第一个大于 value 的元素。

参数解释:

  • first:范围的起始迭代器
  • last:范围的终止迭代器
  • value:要查找的值
  • comp:比较函数对象,用于定义元素的比较方式

该实现假设了输入的迭代器是随机访问迭代器,因此可以使用 std::advancestd::distance 来计算迭代器之间的距离和移动迭代器。实际的标准库实现可能会更加复杂,并且会根据不同的情况进行优化。

upper_bound(jobs.begin(), jobs.begin()+i-1, jobs[i-1][0], [](int st, vector<int>& job){return st < job[1];})

upper_bound(jobs.begin(), jobs.begin()+i-1, jobs[i-1][0], [](int st, vector<int>& job){return st > job[1];})

的区别:
这两个 upper_bound 函数调用的区别在于它们所使用的比较函数对象的不同。这些函数都是用来在已排序的序列中查找某个值的上界的。让我们分析一下这两个调用:

  1. 第一个调用使用的比较函数是 [](int st, vector<int>& job){ return st < job[1]; },它的作用是比较给定的时间 st 和任务的结束时间 job[1]。这个比较函数适用于在结束时间升序排序的情况下查找 st 的上界,即在 jobs 中找到第一个结束时间大于 st 的任务的位置。

  2. 第二个调用使用的比较函数是 [](int st, vector<int>& job){ return st > job[1]; },它的作用是比较给定的时间 st 和任务的结束时间 job[1]。这个比较函数适用于在结束时间降序排序的情况下查找 st 的上界,即在 jobs 中找到第一个结束时间小于 st 的任务的位置。

所以,这两个调用的区别在于它们所使用的比较函数导致了不同的排序顺序和查找逻辑。

函数对象介绍

函数对象是指可以像函数一样被调用的对象。在C++中,函数对象可以是函数指针、函数、Lambda 表达式或重载了函数调用运算符 operator() 的类对象。

函数对象可以作为参数传递给标准库中的算法,如 std::sortstd::find_if 等,用于指定算法的行为。这种方式使得算法更加灵活,可以根据不同的需求使用不同的比较方式或操作方式。

以下是一些关于函数对象的重要概念和用法:

  1. 函数调用运算符 operator():重载了这个运算符的类对象可以像函数一样被调用。当对象被调用时,operator() 会被执行。

  2. Lambda 表达式:Lambda 表达式是一种轻量级的匿名函数,可以用于创建临时的函数对象。它可以在需要函数对象的地方直接定义,使代码更加简洁。

  3. 标准库算法:标准库提供了许多算法,如排序、查找、变换等,这些算法通常都可以接受函数对象作为参数,用于指定算法的行为。

  4. 适配器:函数对象可以通过适配器来改变其行为,如 std::bind 可以用于绑定参数,std::not1 可以用于对谓词取反等。

函数对象的灵活性和可重用性使得它们在C++中被广泛应用于各种场景,包括算法、事件处理、回调函数等。

可调用对象

可调用对象是指可以像函数一样被调用的对象。在 C++ 中,可调用对象可以是函数、函数指针、成员函数指针、函数对象(仿函数)、Lambda 表达式等。它们都可以在调用时像函数一样被执行。

不同类型的可调用对象:

  1. 函数:最基本的可调用对象,就是传统的函数。
int add(int a, int b) {return a + b;
}
  1. 函数指针:指向函数的指针,可以像函数一样被调用。
int (*funcPtr)(int, int) = add;
int result = funcPtr(3, 4); // 调用函数指针
  1. 成员函数指针:指向类的成员函数的指针。
class MyClass {
public:int multiply(int a, int b) {return a * b;}
};int (MyClass::*memFuncPtr)(int, int) = &MyClass::multiply;
MyClass obj;
int result = (obj.*memFuncPtr)(3, 4); // 调用成员函数指针
  1. 函数对象(仿函数):重载了函数调用运算符 operator() 的类对象,可以像函数一样被调用。
class Add {
public:int operator()(int a, int b) {return a + b;}
};Add addObj;
int result = addObj(3, 4); // 调用函数对象
  1. Lambda 表达式:匿名函数,可以直接在需要的地方定义和使用,也可以像函数一样被调用。
auto lambda = [](int a, int b) { return a + b; };
int result = lambda(3, 4); // 调用 Lambda 表达式

在 C++ 中,可调用对象的灵活性和多样性使得它们可以适用于各种不同的场景,例如作为算法的参数、事件处理、回调函数等。

lower_bound 和 upper_bound 的区别?

lower_boundupper_bound 在功能上有所区别,尽管它们都是用于在有序序列中进行查找的算法:

  1. lower_bound

    • 返回的是第一个大于或等于给定值的元素的位置。
    • 如果在序列中找不到大于或等于给定值的元素,则返回指向序列末尾的迭代器。
    • 如果序列中存在多个等于给定值的元素,lower_bound 会返回它们中第一个元素的位置。
  2. upper_bound

    • 返回的是第一个大于给定值的元素的位置。
    • 如果在序列中找不到大于给定值的元素,则返回指向序列末尾的迭代器。
    • 如果序列中存在多个等于给定值的元素,upper_bound 会返回大于这些元素的第一个位置。

因此,lower_bound 返回的位置可能是等于给定值的元素的位置,而 upper_bound 则一定是大于给定值的元素的位置。这两个函数在处理有序序列时很有用,尤其是在需要进行范围查询或插入操作时。

sort 函数

std::sort 是 C++ 标准库中的一个算法,位于 <algorithm> 头文件中,用于对序列进行排序。它采用的是快速排序(Quicksort)或者堆排序(Heapsort)等效率较高的排序算法。

std::sort 函数的函数签名如下:

template< class RandomIt >
void sort( RandomIt first, RandomIt last );

其中:

  • firstlast 是表示要排序的序列的迭代器范围,即 [first, last),它们定义了要排序的区间。

std::sort 函数会按照默认的升序规则对指定的序列进行排序。

要按照降序规则排序,可以通过传递一个自定义的比较函数作为第三个参数。比较函数应当返回一个布尔值,指示其第一个参数是否应该排在第二个参数之前。如果第一个参数应排在第二个参数之前,则返回 true;否则,返回 false

以下是一个示例,展示如何使用 std::sort 对序列进行升序和降序排序:

#include <iostream>
#include <algorithm>
#include <vector>// 自定义比较函数,用于降序排序
bool descending(int a, int b) {return a > b;
}int main() {std::vector<int> vec = {5, 2, 9, 3, 7};// 升序排序std::sort(vec.begin(), vec.end());std::cout << "Ascending order: ";for (int num : vec) {std::cout << num << " ";}std::cout << std::endl;// 降序排序std::sort(vec.begin(), vec.end(), descending);std::cout << "Descending order: ";for (int num : vec) {std::cout << num << " ";}std::cout << std::endl;return 0;
}

在这个示例中,我们首先使用 std::sort 对序列进行升序排序,然后再次调用 std::sort,但这次传递了自定义的比较函数 descending,从而实现了降序排序。

相关文章:

leetcode 1235

leetcode 1235 代码 class Solution { public:int jobScheduling(vector<int>& startTime, vector<int>& endTime, vector<int>& profit) {int n startTime.size();vector<vector<int>> jobs(n);for(int i0; i<n; i){jobs[i] …...

Activiti7 开发快速入门【2024版】

记录开发最核心的部分&#xff0c;理论结合业务实操减少废话&#xff0c;从未接触工作流快速带入开发。假设你是后端的同学学过JAVA和流程图&#xff0c;则可以继续向后看&#xff0c;否则先把基础课程书准备好先翻翻。 为什么要工作流 比起直接使用状态字段&#xff0c;工作…...

vue3组件插槽

Index.vue: <script setup> import { ref, onMounted } from vue import Child from ./Child.vue import ./index.cssonMounted(() > {}) </script><template><div class"m-home-wrap"><Child>插槽</Child><div class&qu…...

Cloudera简介和安装部署

ChatGPT Cloudera 是一个基于 Apache Hadoop 的数据管理和分析平台。它是由 Hadoop 的几位创始人及早期贡献者于 2008 年创立的公司&#xff0c;并随着公司的不断发展&#xff0c;Cloudera 开始提供企业级的解决方案&#xff0c;帮助企业更好地利用 Hadoop 生态系统进行大数据…...

Spring Boot集成Ldap快速入门Demo

1.Ldap介绍 LDAP&#xff0c;Lightweight Directory Access Protocol&#xff0c;轻量级目录访问协议. LDAP是一种特殊的服务器&#xff0c;可以存储数据数据的存储是目录形式的&#xff0c;或者可以理解为树状结构&#xff08;一层套一层&#xff09;一般存储关于用户、用户…...

杨辉三角的打印

题目内容&#xff1a; 在屏幕上打印杨辉三角。 思路&#xff1a; 首先我们通过观察发现&#xff0c;每一步的打印都与行列数有关&#xff0c;中间的数据由这一列和上一行的前一列数据控制。所以我们可以使用二维数组进行操作&#xff1a; &#xff08;&#xff11;&#xff…...

贪吃蛇(下)游戏的实现

感谢大佬的光临各位&#xff0c;希望和大家一起进步&#xff0c;望得到你的三连&#xff0c;互三支持&#xff0c;一起进步 个人主页&#xff1a;LaNzikinh-CSDN博客 文章目录 前言一.蛇和食物的打印二.游戏的运行逻辑三.结束游戏 &#xff08;善后工作&#xff09;四.游戏的测…...

偏微分方程算法之椭圆型方程差分格式编程示例

目录 一、示例1-五点菱形格式 1.1 C代码 1.2 计算结果 二、示例2-九点紧差分格式 2.1 C代码 2.2 计算结果 三、示例3-二阶混合边值 3.1 C代码 3.2 计算结果 本专栏对椭圆型偏微分方程的三种主要差分方法进行了介绍&#xff0c;并给出相应格式的理论推导过程。为加深对…...

PCIe协议之-TLP路由基础

✨前言&#xff1a; 在PCI Express (PCIe) 技术中&#xff0c;数据包的路由方式对于确保信息能够高效、准确地传送至目标设备至关重要。PCIe定义了几种路由方式&#xff0c;主要有以下几种。 &#x1f31f;地址路由&#xff08;Address Based Routing&#xff09; 这是最基本…...

inline内联函数-虚函数(virtual)可以是内联函数(inline)吗?

目录标题 inline内联函数特征&#xff1a;使用&#xff1a;编译器对inline函数的处理步骤优点&#xff1a;缺点&#xff1a; 虚函数&#xff08;virtual&#xff09;可以是内联函数&#xff08;inline&#xff09;吗&#xff1f;特征&#xff1a;使用&#xff1a; inline内联函…...

Spring Boot | Spring Boot 消息管理 ( 消息中间件 ) 、RabbitMQ“消息中间件“

目录: 一、"消息服务" 概述 :1.1 为什么要使用 "消息服务" ( 消息中间件 ) &#xff1f;① 异步处理② 应用解耦③ 流量削峰④ 分布式事务管理 1.2 常用 "消息中间件" 介绍 :ActiveMQ ( 广泛应用于中小型企业 )RabbitMQ ( 没有特别要求的场景下…...

二层交换机与路由器连通上网实验

华为二层交换机与路由器连通上网实验 二层交换机是一种网络设备&#xff0c;用于在局域网&#xff08;LAN&#xff09;中转发数据帧。它工作在OSI模型的第二层&#xff0c;即数据链路层。二层交换机通过学习和维护MAC地址表&#xff0c;实现了数据的快速转发和广播域的隔离。 实…...

AJAX知识点(前后端交互技术)

原生AJAX AJAX全称为Asynchronous JavaScript And XML,就是异步的JS和XML&#xff0c;通过AJAX可以在浏览器中向服务器发送异步请求&#xff0c;最大的优势&#xff1a;无需刷新就可获取数据。 AJAX不是新的编程语言&#xff0c;而是一种将现有的标准组合在一起使用的新方式 …...

用wordpress为外贸进出口公司搭建多语言国际站

使用WordPress为外贸进出口公司搭建多语言国际站是一个很好的选择&#xff0c;因为WordPress不仅易于使用&#xff0c;而且具有丰富的插件和主题&#xff0c;可以支持多语言内容。以下是搭建多语言国际站的步骤和建议&#xff1a; 安装WordPress&#xff1a;首先&#xff0c;您…...

雷军-2022.8小米创业思考-6-互联网七字诀之口碑:口碑即定位,超预期才有口碑,品牌建设

第六章 互联网七字诀 专注、极致、口碑、快&#xff0c;这就是我总结的互联网七字诀&#xff0c;也是我对互联网思维的高度概括。 口碑 用户口碑是所有产品成功的关键因素&#xff0c;这是不言而喻的公理。 资源永远有限&#xff0c;对于创业公司尤其如此。只有专注&#xf…...

欧盟MDR法规对医疗器械网络安全都有哪些要求?

MDR&#xff0c;欧盟医疗器械法规&#xff08;Medical Device REGULATION (EU) 2017/745&#xff0c;简称“MDR”&#xff09;&#xff0c;当医疗器械办理欧盟CE认证时&#xff0c;需满足新法规 MDR (EU) 2017/745要求。 M DR符合性评估 医械网络安全咨询与相关文件出具&#x…...

Linux —— 信号初识

Linux —— 信号初识 什么是信号测试几个信号signal函数函数原型参数说明返回值注意事项示例 后台程序前台转后台检测输入中断向量表 我们今天来继续学习Linux的内容&#xff0c;今天我们要了解的是Linux操作系统中的信号&#xff1a; 什么是信号 信号是操作系统内核与进程之…...

webpack进阶 -- 自定义Plugin,Loader封装打包优化

介绍 Webpack 是一个现代 JavaScript 应用程序的静态模块打包器(module bundler)。在 Webpack 处理应用程序时&#xff0c;它会在内部构建一个依赖图(dependency graph)&#xff0c;这个依赖图对应映射到项目所需的每个模块&#xff0c;并生成一个或多个 bundle。在这个过程中…...

《Decoupled Optimisation for Long-Tailed Visual Recognition》阅读笔记

论文标题 《Decoupled Optimisation for Long-Tailed Visual Recognition》 长尾视觉识别的解耦优化 作者 Cong Cong、Shiyu Xuan、Sidong Liu、Shiliang Zhang、Maurice Pagnucco 和 Yang Song、 来自新南威尔士大学计算机科学与工程学院、北京大学计算机学院多媒体信息处…...

Springboot+Vue项目-基于Java+MySQL的毕业就业信息管理系统(附源码+演示视频+LW)

大家好&#xff01;我是程序猿老A&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 &#x1f49e;当前专栏&#xff1a;Java毕业设计 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f380; Python毕业设计 &…...

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…...

Java如何权衡是使用无序的数组还是有序的数组

在 Java 中,选择有序数组还是无序数组取决于具体场景的性能需求与操作特点。以下是关键权衡因素及决策指南: ⚖️ 核心权衡维度 维度有序数组无序数组查询性能二分查找 O(log n) ✅线性扫描 O(n) ❌插入/删除需移位维护顺序 O(n) ❌直接操作尾部 O(1) ✅内存开销与无序数组相…...

解决Ubuntu22.04 VMware失败的问题 ubuntu入门之二十八

现象1 打开VMware失败 Ubuntu升级之后打开VMware上报需要安装vmmon和vmnet&#xff0c;点击确认后如下提示 最终上报fail 解决方法 内核升级导致&#xff0c;需要在新内核下重新下载编译安装 查看版本 $ vmware -v VMware Workstation 17.5.1 build-23298084$ lsb_release…...

AtCoder 第409​场初级竞赛 A~E题解

A Conflict 【题目链接】 原题链接&#xff1a;A - Conflict 【考点】 枚举 【题目大意】 找到是否有两人都想要的物品。 【解析】 遍历两端字符串&#xff0c;只有在同时为 o 时输出 Yes 并结束程序&#xff0c;否则输出 No。 【难度】 GESP三级 【代码参考】 #i…...

c#开发AI模型对话

AI模型 前面已经介绍了一般AI模型本地部署&#xff0c;直接调用现成的模型数据。这里主要讲述讲接口集成到我们自己的程序中使用方式。 微软提供了ML.NET来开发和使用AI模型&#xff0c;但是目前国内可能使用不多&#xff0c;至少实践例子很少看见。开发训练模型就不介绍了&am…...

基于matlab策略迭代和值迭代法的动态规划

经典的基于策略迭代和值迭代法的动态规划matlab代码&#xff0c;实现机器人的最优运输 Dynamic-Programming-master/Environment.pdf , 104724 Dynamic-Programming-master/README.md , 506 Dynamic-Programming-master/generalizedPolicyIteration.m , 1970 Dynamic-Programm…...

算法:模拟

1.替换所有的问号 1576. 替换所有的问号 - 力扣&#xff08;LeetCode&#xff09; ​遍历字符串​&#xff1a;通过外层循环逐一检查每个字符。​遇到 ? 时处理​&#xff1a; 内层循环遍历小写字母&#xff08;a 到 z&#xff09;。对每个字母检查是否满足&#xff1a; ​与…...

LangChain知识库管理后端接口:数据库操作详解—— 构建本地知识库系统的基础《二》

这段 Python 代码是一个完整的 知识库数据库操作模块&#xff0c;用于对本地知识库系统中的知识库进行增删改查&#xff08;CRUD&#xff09;操作。它基于 SQLAlchemy ORM 框架 和一个自定义的装饰器 with_session 实现数据库会话管理。 &#x1f4d8; 一、整体功能概述 该模块…...

MySQL JOIN 表过多的优化思路

当 MySQL 查询涉及大量表 JOIN 时&#xff0c;性能会显著下降。以下是优化思路和简易实现方法&#xff1a; 一、核心优化思路 减少 JOIN 数量 数据冗余&#xff1a;添加必要的冗余字段&#xff08;如订单表直接存储用户名&#xff09;合并表&#xff1a;将频繁关联的小表合并成…...

day36-多路IO复用

一、基本概念 &#xff08;服务器多客户端模型&#xff09; 定义&#xff1a;单线程或单进程同时监测若干个文件描述符是否可以执行IO操作的能力 作用&#xff1a;应用程序通常需要处理来自多条事件流中的事件&#xff0c;比如我现在用的电脑&#xff0c;需要同时处理键盘鼠标…...