【双指针】【C++算法】1537. 最大得分
作者推荐
【深度优先搜索】【树】【图论】2973. 树中每个节点放置的金币数目
本文涉及知识点
双指针
LeetCoce 1537. 最大得分
你有两个 有序 且数组内元素互不相同的数组 nums1 和 nums2 。
一条 合法路径 定义如下:
选择数组 nums1 或者 nums2 开始遍历(从下标 0 处开始)。
从左到右遍历当前数组。
如果你遇到了 nums1 和 nums2 中都存在的值,那么你可以切换路径到另一个数组对应数字处继续遍历(但在合法路径中重复数字只会被统计一次)。
得分 定义为合法路径中不同数字的和。
请你返回 所有可能 合法路径 中的最大得分。由于答案可能很大,请你将它对 10^9 + 7 取余后返回。
示例 1:
输入:nums1 = [2,4,5,8,10], nums2 = [4,6,8,9]
输出:30
解释:合法路径包括:
[2,4,5,8,10], [2,4,5,8,9], [2,4,6,8,9], [2,4,6,8,10],(从 nums1 开始遍历)
[4,6,8,9], [4,5,8,10], [4,5,8,9], [4,6,8,10] (从 nums2 开始遍历)
最大得分为上图中的绿色路径 [2,4,6,8,10] 。
示例 2:
输入:nums1 = [1,3,5,7,9], nums2 = [3,5,100]
输出:109
解释:最大得分由路径 [1,3,5,100] 得到。
示例 3:
输入:nums1 = [1,2,3,4,5], nums2 = [6,7,8,9,10]
输出:40
解释:nums1 和 nums2 之间无相同数字。
最大得分由路径[6,7,8,9,10]得到。
提示:
1 <= nums1.length, nums2.length <= 105
1 <= nums1[i], nums2[i] <= 107
nums1 和 nums2 都是严格递增的数组。
双指针
max1 记录从nums[0]开始,nums[i-1]结束的最大得分。max2记录nums2[0]开始,nums2[j]结束的最大得分。iMax=max(max1,max2)。返回iMax。
如果没有相同值:
max1 = nums1[0,i)之和,max2=nums2[0,j)之和
如果有相同值。
假定第一个相同值是nums[ix] nums[jx]。 i=ix+1时,y=jx+1时,max1和max2都等于iMax。
用iMax替换 nums1[0,ix] ,用iMax替换nums2[0,iy]继续迭代。
代码
核心代码
class Solution {
public:int maxSum(vector<int>& nums1, vector<int>& nums2) {long long max1 = 0, max2 = 0;for (int i = 0, j = 0; (i < nums1.size()) || (j < nums2.size());){if ((i < nums1.size()) && (j < nums2.size())){const int iCmp = nums1[i] - nums2[j];if (0 == iCmp){max1 = max2 = max(max1 + nums1[i++], max2 + nums2[j++]);}else if (iCmp < 0){max1 += nums1[i++];}else{max2 += nums2[j++];}}else if (i < nums1.size()){max1 += nums1[i++];}else{max2 += nums2[j++];}}return max(max1, max2) % (1'000'000'000+ 7);}
};
测试用例
template<class T>
void Assert(const T& t1, const T& t2)
{assert(t1 == t2);
}template<class T>
void Assert(const vector<T>& v1, const vector<T>& v2)
{if (v1.size() != v2.size()){assert(false);return;}for (int i = 0; i < v1.size(); i++){Assert(v1[i], v2[i]);}}int main()
{ vector<int> nums1,nums2;int k;{Solution sln;nums1 = { 2, 4, 5, 8, 10 }, nums2 = { 4, 6, 8, 9 };auto res = sln.maxSum(nums1, nums2);Assert(30, res);}{Solution sln;nums1 = { 1, 3, 5, 7, 9 }, nums2 = { 3, 5, 100 };auto res = sln.maxSum(nums1, nums2);Assert(109, res);}{Solution sln;nums1 = { 1, 2, 3, 4, 5 }, nums2 = { 6, 7, 8, 9, 10 };auto res = sln.maxSum(nums1, nums2);Assert(40, res);}
}
2023年8月版
class Solution {
public:
int maxSum(vector& nums1, vector& nums2) {
int i1 = 0, i2 = 0;
long long iiNum1 = 0, iiNum2 = 0;
long long iiRet = 0;
while (true)
{
while ((i1 < nums1.size()) && (i2 < nums2.size()) && (nums1[i1] != nums2[i2]))
{
if (nums1[i1] < nums2[i2])
{
iiNum1 += nums1[i1];
i1++;
}
else
{
iiNum2 += nums2[i2];
i2++;
}
}
if ((i1 < nums1.size()) && (i2 < nums2.size()))
{
iiRet += max(iiNum1, iiNum2) + nums1[i1];
iiNum1 = iiNum2 = 0;
i1++;
i2++;
continue;
}
while (i1 < nums1.size())
{
iiNum1 += nums1[i1];
i1++;
}
while (i2 < nums2.size())
{
iiNum2 += nums2[i2];
i2++;
}
iiRet += max(iiNum1, iiNum2);
break;
}
const int s_iMod = 1000000007;
return iiRet % s_iMod;
}
};

扩展阅读
视频课程
有效学习:明确的目标 及时的反馈 拉伸区(难度合适),可以先学简单的课程,请移步CSDN学院,听白银讲师(也就是鄙人)的讲解。
https://edu.csdn.net/course/detail/38771
如何你想快
速形成战斗了,为老板分忧,请学习C#入职培训、C++入职培训等课程
https://edu.csdn.net/lecturer/6176
相关
下载
想高屋建瓴的学习算法,请下载《喜缺全书算法册》doc版
https://download.csdn.net/download/he_zhidan/88348653
| 我想对大家说的话 |
|---|
| 闻缺陷则喜是一个美好的愿望,早发现问题,早修改问题,给老板节约钱。 |
| 子墨子言之:事无终始,无务多业。也就是我们常说的专业的人做专业的事。 |
| 如果程序是一条龙,那算法就是他的是睛 |
测试环境
操作系统:win7 开发环境: VS2019 C++17
或者 操作系统:win10 开发环境: VS2022 **C+
+17**
如无特殊说明,本算法用**C++**实现。

相关文章:
【双指针】【C++算法】1537. 最大得分
作者推荐 【深度优先搜索】【树】【图论】2973. 树中每个节点放置的金币数目 本文涉及知识点 双指针 LeetCoce 1537. 最大得分 你有两个 有序 且数组内元素互不相同的数组 nums1 和 nums2 。 一条 合法路径 定义如下: 选择数组 nums1 或者 nums2 开始遍历&…...
golang常用库之-操作数据库ORM:GORM 包介绍 | 一些 GORM 提示和注意事项
文章目录 golang操作数据库ORM:GORM 包介绍及实战一、什么是GORM 包二、GORM基本使用官方快速开始demo 一些 GORM 提示和注意事项 参考 golang操作数据库ORM:GORM 包介绍及实战 一、什么是GORM 包 官网:https://gorm.io/ github:…...
Stream流学习笔记
Stream流 创建流中间操作1、filter2、map3、distinct4、sorted5、limit6、skip7、flatMap 终结操作1、forEach2、count3、max&min4、collect5、查找与匹配 创建流 单例集合:集合对象.stream() List<Integer> list new ArrayList<>(); Stream<…...
单片机——FLASH(2)
文章目录 flash (stm32f40x 41x的内存映射中区域详解)flash写数据时 flash (stm32f40x 41x的内存映射中区域详解) Main memory 主存储区 放置代码和常数 System memory 系统存储区 方式bootloader代码 OTP区 一次性可编程区 选项…...
个体诊所门诊电子处方开单管理系统软件,配方模板病历模板设置一键导入操作教程
个体诊所门诊电子处方开单管理系统软件,配方模板病历模板设置一键导入操作教程 一、前言 以下操作教程以 佳易王诊所电子处方软件V17.2为例说明,最新版V17.3下载可以点击最下方官网卡片了解。 1、在现实生活中,医师开单可谓是争分夺秒&…...
ELAdmin 配置定时任务
定义方法 在自己的 Module 中写个要执行的方法。 比如获取微信公众号的 accessToken,每两个小时更新一次。这种的其实使用 Spring 的 Scheduled 更方便些,此处仅为演示。 package me.zhengjie.mp.task;import com.alibaba.fastjson.JSON; import lombo…...
【服务器部署】Docker环境的安装
基于CentOS系统的服务器环境下安装Docker环境,安装步骤参考官方指南:https://docs.docker.com/engine/install/centos/ 配置库 sudo yum install -y yum-utils sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-c…...
leetcode刷题--贪心算法
七. 贪心算法 文章目录 七. 贪心算法1. 605 种花问题2. 121 买卖股票的最佳时机3. 561 数组拆分4. 455 分发饼干5. 575 分糖果6. 135 分发糖果7. 409 最长回文串8. 621 任务调度器9. 179 最大数10. 56 合并区间11. 57 插入区间13. 452 用最少数量的箭引爆气球14. 435 无重叠区间…...
《Java 简易速速上手小册》第5章:Java 开发工具和框架(2024 最新版)
文章目录 5.1 Maven 和 Gradle - 构建你的堡垒5.1.1 基础知识5.1.2 重点案例:使用 Maven 构建一个简单的 Java 应用5.1.3 拓展案例 1:使用 Gradle 构建一个 Spring Boot 应用5.1.4 拓展案例 2:使用 Maven 管理多模块项目 5.2 Spring 框架 - 你…...
Python json解析
在Python中解析JSON(JavaScript Object Notation)非常简单,标准库中的json模块提供了必要的功能。JSON是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成。 以下是使用Python解析JSON的一些基本…...
[FFmpeg学习]从视频中获取图片
从视频中获取图片是一个比较直观的例子,这里从一个基础的例子来查看FFmpeg相关api的使用,从mp4文件中获取一帧图像,保存为jpeg格式图片,mp4文件比较好准备,一般手机录屏文件就是mp4格式。 原理还是比较清楚࿰…...
Redis集中管理Session和系统初始化参数详解
Redis 是一个开源的、基于内存的键值存储系统,通常用作数据库、缓存或消息传递系统。在 Web 应用程序中,Redis 常用于集中管理 Session 数据和系统初始化参数。 Redis 管理 Session Session 是 Web 应用程序中用于保持用户状态的一种机制…...
[网鼎杯 2020 朱雀组]phpweb
抓包发现两个参数,结合报文返回的warning猜测两个参数一个传函数名,另一个传函数参数 尝试直接system(ls /),发现被过滤了 file_get_contents获取index.php的源码,发现可以反序列化实现RCE 这里复现的时候不知道为什么显示不全…...
情人节html代码
一、一个带有心形和祝福消息的页面 如果想在网页上创建一个简单的情人节祝福,可以使用HTML和CSS。以下是一个简单的例子,它创建了一个带有心形和祝福消息的页面: <!DOCTYPE html> <html> <head> <title>情人节…...
键盘重映射禁用 CtrlAltDel 键的利弊
目录 前言 一、Scancode Map 的规范 二、禁用 CtrlAltDel 的方法及其缺陷 三、编程实现和测试 3.1 C 实现的简易修改工具 3.2 C# 实现的窗口工具 四、总结 本文属于原创文章,转载请注明出处: https://blog.csdn.net/qq_59075481/article/details…...
【网工】华为设备命令学习(综合实验一)
实验要求和实验成果如图所示。 LSW2不需要其他配置,其下就一台设备,不需要区分。 LSW3配置如下: <Huawei>sy Enter system view, return user view with CtrlZ. [Huawei]un in en //关闭系统提示信息 Info: Information …...
JavaScript中的常见算法
一.排序算法 1.冒泡排序 冒泡排序比较所有相邻的两个项,如果第一个比第二个大,则交换它们。元素项向上移动至 正确的顺序,就好像气泡升至表面一样。 function bubbleSort(arr) {const { length } arrfor (let i 0; i < length - 1; i)…...
桥接模式:连接抽象与实现的设计艺术
桥接模式:连接抽象与实现的设计艺术 在软件开发中,设计模式是帮助我们以优雅的方式解决问题的模板。桥接模式(Bridge Pattern)是一种结构型设计模式,它的主要目标是将抽象部分与实现部分分离,这样两者可以…...
C语言——oj刷题——字符串左旋
问题: 实现一个函数,可以左旋字符串中的k个字符。 例如: ABCD左旋一个字符得到BCDA ABCD左旋两个字符得到CDAB 实现: 当我们谈到字符串左旋时,我们指的是将字符串中的字符向左移动一定数量的位置。这个问题在编程中…...
神经网络(Nature Network)
最近接触目标检测较多,再此对最基本的神经网络知识进行补充,本博客适合想入门人工智能、其含有线性代数及高等数学基础的人群观看 1.构成 由输入层、隐藏层、输出层、激活函数、损失函数组成。 输入层:接收原始数据隐藏层:进行…...
生成xcframework
打包 XCFramework 的方法 XCFramework 是苹果推出的一种多平台二进制分发格式,可以包含多个架构和平台的代码。打包 XCFramework 通常用于分发库或框架。 使用 Xcode 命令行工具打包 通过 xcodebuild 命令可以打包 XCFramework。确保项目已经配置好需要支持的平台…...
盘古信息PCB行业解决方案:以全域场景重构,激活智造新未来
一、破局:PCB行业的时代之问 在数字经济蓬勃发展的浪潮中,PCB(印制电路板)作为 “电子产品之母”,其重要性愈发凸显。随着 5G、人工智能等新兴技术的加速渗透,PCB行业面临着前所未有的挑战与机遇。产品迭代…...
前端倒计时误差!
提示:记录工作中遇到的需求及解决办法 文章目录 前言一、误差从何而来?二、五大解决方案1. 动态校准法(基础版)2. Web Worker 计时3. 服务器时间同步4. Performance API 高精度计时5. 页面可见性API优化三、生产环境最佳实践四、终极解决方案架构前言 前几天听说公司某个项…...
centos 7 部署awstats 网站访问检测
一、基础环境准备(两种安装方式都要做) bash # 安装必要依赖 yum install -y httpd perl mod_perl perl-Time-HiRes perl-DateTime systemctl enable httpd # 设置 Apache 开机自启 systemctl start httpd # 启动 Apache二、安装 AWStats࿰…...
解决Ubuntu22.04 VMware失败的问题 ubuntu入门之二十八
现象1 打开VMware失败 Ubuntu升级之后打开VMware上报需要安装vmmon和vmnet,点击确认后如下提示 最终上报fail 解决方法 内核升级导致,需要在新内核下重新下载编译安装 查看版本 $ vmware -v VMware Workstation 17.5.1 build-23298084$ lsb_release…...
【JVM】- 内存结构
引言 JVM:Java Virtual Machine 定义:Java虚拟机,Java二进制字节码的运行环境好处: 一次编写,到处运行自动内存管理,垃圾回收的功能数组下标越界检查(会抛异常,不会覆盖到其他代码…...
屋顶变身“发电站” ,中天合创屋面分布式光伏发电项目顺利并网!
5月28日,中天合创屋面分布式光伏发电项目顺利并网发电,该项目位于内蒙古自治区鄂尔多斯市乌审旗,项目利用中天合创聚乙烯、聚丙烯仓库屋面作为场地建设光伏电站,总装机容量为9.96MWp。 项目投运后,每年可节约标煤3670…...
【Oracle】分区表
个人主页:Guiat 归属专栏:Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...
【Go语言基础【13】】函数、闭包、方法
文章目录 零、概述一、函数基础1、函数基础概念2、参数传递机制3、返回值特性3.1. 多返回值3.2. 命名返回值3.3. 错误处理 二、函数类型与高阶函数1. 函数类型定义2. 高阶函数(函数作为参数、返回值) 三、匿名函数与闭包1. 匿名函数(Lambda函…...
GitFlow 工作模式(详解)
今天再学项目的过程中遇到使用gitflow模式管理代码,因此进行学习并且发布关于gitflow的一些思考 Git与GitFlow模式 我们在写代码的时候通常会进行网上保存,无论是github还是gittee,都是一种基于git去保存代码的形式,这样保存代码…...
