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,从而实现了降序排序。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/319975.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JuiceFS v1.2-beta1,Gateway 升级,多用户场景权限管理更灵活

JuiceFS v1.2-beta1 今天正式发布。在这个版本中&#xff0c;除了进行了大量使用体验优化和 bug 修复外&#xff0c;新增三个特性&#xff1a; Gateway 功能扩展&#xff1a;新增了“身份和访问管理&#xff08;Identity and Access Management&#xff0c;IAM&#xff09;” 与…

JAVA面试专题-框架篇(Spring+Mybatis)

Spring Spring框架中的单例bean是线程安全的吗&#xff1f; bean上面可以加入注解Scope&#xff0c;如果是singleton&#xff08;默认&#xff09;&#xff0c;意味着bean在每个spring IOC容器中只有一个实例&#xff1b;如果是prototype&#xff0c;说明一个bean定义可以有多…

Centos上通过Docker安装ES管理端kibana

系列文章目录 文章目录 系列文章目录前言 前言 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站&#xff0c;这篇文章男女通用&#xff0c;看懂了就去分享给你的码吧。 Elasticsearch 是一…

《QT实用小工具·五十六》自适应界面变化的控件

1、概述 源码放在文章末尾 该项目实现了网格显示多张带文字的图片在界面中自适应布局 特点 跟随窗口大小变换位置&#xff0c;并带移动动画 响应鼠标事件&#xff0c;图片缩放动画 点击水波纹动画 项目demo演示如下所示&#xff1a; 项目部分代码如下所示&#xff1a; #i…

Electron+Vue3+Vite+ElectronForge整合 - 一键启动两个服务 一键打包两个服务

说明 本文介绍一下 Electron Vue3 Vite Electron Forge 的高级整合操作。vue3 : 使用 TS 的语法开发&#xff1b; Electron : 使用 JS 的语法开发。本文将从项目初始化开始&#xff0c;一步一步的完成项目的启动、打包全流程的介绍。实现的效果是 &#xff1a; 1、一个正常…

CRE-LLM:告别复杂特征工程,直接关系抽取

CRE-LLM&#xff1a;告别复杂特征工程&#xff0c;直接关系抽取 提出背景CRE-LLM 宏观分析CRE-LLM 微观分析1. 构建指令集&#xff08;Instruction Design&#xff09;2. 高效微调大型语言模型&#xff08;Efficient Fine-Tuning on LLMs&#xff09;3. 方法讨论&#xff08;Di…

Leetcode—706. 设计哈希映射【简单】(constexpr)

2024每日刷题&#xff08;127&#xff09; Leetcode—706. 设计哈希映射 数组实现代码 class MyHashMap { public:MyHashMap() {memset(arr, -1, sizeof(arr));}void put(int key, int value) {arr[key] value;}int get(int key) {if(arr[key] -1) {return -1;} return arr…

【在线OJ】Vue在线OJ项目

一、主页 二、题库 三、在线编译器 四、比赛 五、搜索 六、个人主页

保研面试408复习 2——操作系统、计网

文章目录 1、操作系统一、进程、线程的概念以及区别&#xff1f;二、进程间的通信方式&#xff1f; 2、计算机网络一、香农准则二、协议的三要素1. 语法2. 语义3. 时序 标记文字记忆&#xff0c;加粗文字注意&#xff0c;普通文字理解。 1、操作系统 一、进程、线程的概念以及…

VMware worksation 17 简易安装Centos8.2、Redhat8.2、Ubuntu16.04

系列文章目录 文章目录 系列文章目录前言一、VMware worksation 17 安装二、安装Centos8.2三、安装RHEL8.2四、安装Ubuntu16.04总结 前言 傻瓜式按照Linux系统&#xff0c;如果觉得简单&#xff0c;可以自定义设置&#xff0c;特别是配置一下磁盘空间大小&#xff0c;对以后排…

深入解析:匹配网络(Matching Networks)的原理和应用

匹配网络&#xff08;Matching Networks&#xff09; 深入解析&#xff1a;匹配网络&#xff08;Matching Networks&#xff09;的原理和应用匹配网络的核心原理工作原理算法流程 匹配网络的实现应用示例结论 深入解析&#xff1a;匹配网络&#xff08;Matching Networks&#…

使用docker-compose编排Lnmp(dockerfile) 完成Wordpress

目录 一、 Docker-Compose 1.1Docker-Compose介绍 1.2环境准备 1.2.1准备容器目录及相关文件 1.2.2关闭防火墙关闭防护 1.2.3下载centos:7镜像 1.3Docker-Compose 编排nginx 1.3.1切换工作目录 1.3.2编写 Dockerfile 文件 1.3.3修改nginx.conf配置文件 1.4Docker-Co…

leetCode74. 搜索二维矩阵

leetCode74. 搜索二维矩阵 二分法模板&#xff1a;见到背过就行 // 区间[L,R]被划分为[L,mid]和[mid 1, R]时使用这个模板 int bsearch_1(int l, int r){while(l < r){int mid l r >> 1;if(check(mid)) r mid; //check()判断mid是否满足性质else l mid 1;}retu…

Istio 流量管理(请求路由、流量转移、请求重试、流量镜像、故障注入、熔断等)介绍及使用

一、Istio 流量管理 Istio是一个开源的服务网格&#xff0c;它为分布式微服务架构提供了网络层的抽象。它使得服务之间的通信变得更为可靠、安全&#xff0c;并且提供了细粒度的流量管理、监控和策略实施功能。Istio通过在服务之间插入一个透明的代理&#xff08;Envoy&#x…

正则表达式_字符匹配/可选字符集

正则表达式&#xff08;Regular Expression&#xff09;也叫匹配模式(Pattern)&#xff0c;用来检验字符串是否满足特 定规则&#xff0c;或从字符串中捕获满足特定规则的子串。 字符匹配 最简单的正则表达式由“普通字符”和“通配符”组成。比如“Room\d\d\d”就这样 的正则…

有这样的黑色产业链你遇到了吗?

今天上午来到公司发现公司的数据库被黑了。还留下了勒索的信息&#xff0c;下面给大家粘贴上。现在这样的产业是不是很多。你怎么看 把公司的数据库全删除了。然后自己新建了一个数据库&#xff0c;又建立了一个表。里面写的内容如下。 omg! 肯定是扫描出来的。这个库对外暴…

ChatGPT Web Midjourney一键集成最新版

准备工具 服务器一台 推荐使用浪浪云服务器 稳定 安全 有保障 chatgpt api 推荐好用白嫖的api 项目演示 项目部署 浏览器访问casaos 添加软件原添加 https://gitee.com/langlangy_1/CasaOS-AppStore-LangLangy/raw/master/chatmjd.zip 安装此软件 等待安装 安装后再桌面设置…

【Python深度学习(第二版)(4)】神经网络的基本数据结构-张量概念、阶数、使用NumPy操作张量、张量种类、样本轴等概念

文章目录 一. 张量概念二. 张量的阶数1. 标量&#xff08;0阶张量&#xff09;2. 向量&#xff08;1阶张量&#xff09;2. 矩阵&#xff08;2阶张量&#xff09;3. 3阶张量与更高阶的张量 三. 张量属性及操作张量1. 张量的关键属性2. 在NumPy中操作张量2.1. 选择某个图片数据2.…

常用语音识别开源四大工具:Kaldi,PaddleSpeech,WeNet,EspNet

无论是基于成本效益还是社区支持&#xff0c;我都坚决认为开源才是推动一切应用的动力源泉。下面推荐语音识别开源工具&#xff1a;Kaldi&#xff0c;Paddle&#xff0c;WeNet&#xff0c;EspNet。 1、最成熟的Kaldi 一个广受欢迎的开源语音识别工具&#xff0c;由Daniel Pove…

上位机图像处理和嵌入式模块部署(树莓派4b使用lua)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 lua是一个脚本语言&#xff0c;比c语言开发容易&#xff0c;也没有python那么重&#xff0c;整体使用还是非常方便的。一般当成胶水语言进行开发&a…