LeetCode:689. 三个无重叠子数组的最大和(dp C++)

目录

689. 三个无重叠子数组的最大和

题目描述:

实现代码与解析:

dp

原理思路:

滑动窗口:

原理思路:


689. 三个无重叠子数组的最大和

题目描述:

        给你一个整数数组 nums 和一个整数 k ,找出三个长度为 k 、互不重叠、且全部数字和(3 * k 项)最大的子数组,并返回这三个子数组。

以下标的数组形式返回结果,数组中的每一项分别指示每个子数组的起始位置(下标从 0 开始)。如果有多个结果,返回字典序最小的一个。

示例 1:

输入:nums = [1,2,1,2,6,7,5,1], k = 2
输出:[0,3,5]
解释:子数组 [1, 2], [2, 6], [7, 5] 对应的起始下标为 [0, 3, 5]。
也可以取 [2, 1], 但是结果 [1, 3, 5] 在字典序上更大。

示例 2:

输入:nums = [1,2,1,2,1,2,1,2,1], k = 2
输出:[0,2,4]

提示:

  • 1 <= nums.length <= 2 * 104
  • 1 <= nums[i] < 216
  • 1 <= k <= floor(nums.length / 3)

实现代码与解析:

dp

class Solution {
public:vector<int> maxSumOfThreeSubarrays(vector<int>& nums, int k) {reverse(nums.begin(), nums.end());int n = nums.size();vector<vector<int>> f(n + 1, vector<int>(4));// 计算前缀和vector<int> s(n + 1, 0); // 一般0位置空出来,方便处理边界for (int i = 1; i <= n; i++) { // s[1] = nums[0];s[i] = s[i - 1] + nums[i - 1]; }// dpfor (int i = k; i <= n; i++) {for (int j = 1; j < 4; j++) {f[i][j] = max(f[i - k][j - 1] + s[i] - s[i - k], f[i - 1][j]);}}vector<int> res;int j = 3, i = n;while (j > 0) {if (f[i - 1][j] > f[i - k][j - 1] + s[i] - s[i - k]) i--;else {res.push_back(n - i);i -= k; // 跳到前一个位置j--; }}return res;}
};

原理思路:

     众所周知,dp一般是用来求结果的,而不容易输出寻找的过程。

首先,求一下前缀和 s。

dp数组含义:

        与01背包类似,遍历到第 i 个数,在第 j 次选取 或 不选取 的最大值。一共选3次。

用 i  来代表单个数组最后一个数的下标。

递推公式:

        f[i][j] = max(f[i - k][j - 1] + s[i] - s[i - k], f[i - 1][j]);

两种情况:i 选取,下标 i - k 的数 第 j 次不选取的最大值 + 此段数组的和。

                  i 不选取,下标 i - 1第 j 次 选取后的最大值继承过来。

 两者取一个max。

回溯寻找路径:

        利用递推公式,我们判断每个数是通过max取的哪个值来求出路径。加入到res中。

注意:

        此题说明:如果有多个结果,返回字典序最小的一个。

所以,我们反转数组,或者倒着遍历数组,不然会取到字典序大的。

滑动窗口:

class Solution {
public:vector<int> maxSumOfThreeSubarrays(vector<int>& nums, int k) {vector<int> res(3);int sum1 = 0, maxSum1 = 0, idx1 = 0;int sum2 = 0, maxSum12 = 0, idx2 = 0, idx12_1 = 0, idx12_2 = 0;int sum3 = 0, maxSum123 = 0;for (int i = k * 2; i < nums.size(); i++) {sum1 += nums[i - k * 2];sum2 += nums[i - k];sum3 += nums[i];if (i >= k * 3 - 1) {if (sum1 > maxSum1) {maxSum1 = sum1;idx1 = i - k * 3 + 1;}if (maxSum1 + sum2 > maxSum12) {maxSum12 = maxSum1 + sum2;idx12_1 = idx1;idx12_2 = i - k * 2 + 1;}if (maxSum12 + sum3 > maxSum123) {maxSum123 = maxSum12 + sum3;res = {idx12_1, idx12_2, i - k + 1};}sum1 -= nums[i - k * 3 + 1];sum2 -= nums[i - k * 2 + 1];sum3 -= nums[i - k + 1];}}return res;}
};

原理思路:

        这里记录一下我自己的问题。

为什么数组1和数组2为什么有一个idx1,idx12_1?

        因为当数组1的sum为最大时,idx1是一个值,但是此时,数组2与数组1的sum和并不一定是最大的(毕竟要考虑数组之间的不重叠影响),idx12_1用来记录最大的情况时的idx1,而idx12_1,要用idx1来赋值,所以这就是两个idx的含义不同,以及作用的不同。至于为什么数组3没有,因为res就是变相的来记录了,所以不需要单独再次记录,当前想单独写也没问题。

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

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

相关文章

修完这个 Bug 后,MySQL 性能提升了 300%

最近 MySQL 官方在 8.0.35 上修复了一个 bug&#xff1a; 这个 bug 是由 Mark Callaghan 发现的。Mark 早年在 Google MySQL 团队&#xff0c;后来去了 Meta MySQL&#xff0c;也主导了 RocksDB 的开发。 Mark 在 #109595 的 bug report 给出了非常详细的复现步骤 在官方修复后…

Cross-View Transformers for Real-Time Map-View Semantic Segmentation 论文阅读

论文链接 Cross-View Transformers for Real-Time Map-View Semantic Segmentation 0. Abstract 提出了 Cross-View Transformers &#xff0c;一种基于注意力的高效模型&#xff0c;用于来自多个摄像机的地图视图语义分割使用相机感知的跨视图注意机制隐式学习从单个相机视…

【华为OD机试高分必刷题目】决战(JavaPythonC++动态规划DP实现)

🚀你的旅程将在这里启航!本专栏所有题目均包含优质解题思路,每篇都用了Java&Python&C++三种语言分别解题,高质量解题代码,详细代码讲解,助你深入学习,高分通过! 文章目录 【华为OD机试高分必刷题目】决战(Java&Python&C++动态规划DP实现)题目描述解…

MySQL数据库索引以及使用唯一索引实现幂等性

&#x1f4d1;前言 本文主要是MySQL数据库索引以及使用唯一索引实现幂等性的文章&#xff0c;如果有什么需要改进的地方还请大佬指出⛺️ &#x1f3ac;作者简介&#xff1a;大家好&#xff0c;我是青衿&#x1f947; ☁️博客首页&#xff1a;CSDN主页放风讲故事 &#x1f30…

【LeetCode:2736. 最大和查询 | 贪心 + 二分 + 单调栈】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

微信小程序会议OA首页-开发说明创建项目关于flex布局关于尺寸单位(rpx)关于WXS轮播图会议信息

目录 1. 创建项目 2. 关于flex布局 3. 关于尺寸单位&#xff08;rpx&#xff09; 4. 关于WXS 4. 轮播图 5. 会议信息 1. 创建项目 基于微信原生开发工具&#xff0c;稳定版 Stable Build (1.06.22010310) 创建项目前&#xff0c;请确定有小程序测试账号 使用向导创建一个…

北京君正客户应用案例:掌静脉3D人脸猫眼视屏智能锁

凯迪仕在今年4月发布了智能锁旗舰新品K70 Pro Max掌静脉3D人脸猫眼视屏智能锁&#xff0c;随即这款新品也成了行业热议的焦点。凯迪仕每次新品都力求突破精益求精&#xff0c;不仅追求科技感、高级感与品质感&#xff0c;而且赋予科技温度&#xff0c;带来人文化的关怀。K70 Pr…

2023.11.19 hadoop之MapReduce

目录 1.简介 2.分布式计算框架-Map Reduce 3.mapreduce的步骤 4.MapReduce底层原理 map阶段 shuffle阶段 reduce阶段 1.简介 Mapreduce是一个分布式运算程序的编程框架&#xff0c;是用户开发“基于hadoop的数据分析应用”的核心框架&#xff1b; Mapreduce核心功能是…

【SpringBoot3+Vue3】二【实战篇】-后端

目录 一、环境搭建 1、数据库脚本 2、pom 3、yml 4、通过mybatis-X生成实体pojo等 4.1 Article 4.2 Category 4.3 User 5、 Mapper 5.1 ArticleMapper 5.2 CategoryMapper 5.3 UserMapper 6、service 6.1 ArticleService 6.2 CategoryService 6.3 UserService …

workman使用手册1.0

workman官网地址&#xff1a;高性能PHP应用容器 workerman 1&#xff1a;把workman项目放到linux服务器后&#xff0c;需要启动你的php文件&#xff0c;才可以使用 定位到项目根目录&#xff1a;例&#xff1a;cd /mnt/workman 启动代码&#xff1a;php outin.php start -d 停…

关于DBMS_STATS.GATHER_DATABASE_STATS_JOB_PROC的一些发现

任务在哪 这个是11g以后的自动收集统计信息的后台任务&#xff0c;10g之前是在dba_scheduler_jobs里查看 SQL> SELECT CLIENT_NAME ,STATUS ,MEAN_INCOMING_TASKS_7_DAYS,MEAN_INCOMING_TASKS_30_DAYS FROM DBA_AUTOTASK_CLIENT WHERE…

计算机视觉:使用opencv实现车牌识别

1 引言 汽车车牌识别&#xff08;License Plate Recognition&#xff09;是一个日常生活中的普遍应用&#xff0c;特别是在智能交通系统中&#xff0c;汽车牌照识别发挥了巨大的作用。汽车牌照的自动识别技术是把处理图像的方法与计算机的软件技术相连接在一起&#xff0c;以准…

Flutter 中在单个屏幕上实现多个列表

今天&#xff0c;我将提供一个实际的示例&#xff0c;演示如何在单个页面上实现多个列表&#xff0c;这些列表可以水平排列、网格格式、垂直排列&#xff0c;甚至是这些常用布局的组合。 下面是要做的&#xff1a; 实现 让我们从创建一个包含产品所有属性的产品模型开始。 …

ZJU Beamer学习手册(二)

ZJU Beamer学习手册基于 Overleaf 的 ZJU Beamer模板 进行解读&#xff0c;本文则基于该模版进行进一步修改。 参考文献 首先在frame文件夹中增加reference.tex文件&#xff0c;文件内容如下。这段代码对参考文献的引用进行了预处理。 \usepackage[backendbiber]{biblatex} \…

【机器学习】划分训练集和测试集的方法

在机器学习中&#xff0c;我们的模型建立完成后&#xff0c;通常要根据评估指标来对模型进行评估&#xff0c;以此来判断模型的可用性。而评估指标主要的目的是让模型在未知数据上的预测能力最好。因此&#xff0c;我们在模型训练之前&#xff0c;要对训练集和测试集进行划分。…

【Python数据结构与算法】——(线性结构)精选好题分享,不挂科必看系列

&#x1f308;个人主页: Aileen_0v0&#x1f525;系列专栏:<<Python数据结构与算法专栏>>&#x1f4ab;个人格言:"没有罗马,那就自己创造罗马~" 时间复杂度大小比较 1.time complexity of algorithm A is O(n^3) while algorithm B is O(2^n). Which o…

大数据-之LibrA数据库系统告警处理(ALM-12053 主机文件句柄使用率超过阈值)

告警解释 系统每30秒周期性检测主机文件句柄使用率&#xff0c;并把实际使用率和阈值&#xff08;系统默认阈值80%&#xff09;进行比较&#xff0c;当检测到主机文件句柄使用率连续多次&#xff08;默认值为5&#xff09;超过阈值时产生该告警。 用户可通过“系统设置 > …

创新研报|新业务发展是CEO推动企业增长的必要选择 – Mckinsey研究

&#x1f50d;&#x1f4c8; 创新研究报告 |新业务拓展&#xff1a;CEO推动企业成长的必然选择 – 麦肯锡研究 &#x1f525;&#x1f4bc; 所有执行长和商界领袖请注意&#xff01;您是否正在寻找为您的组织释放成长机会的钥匙&#xff1f; &#x1f310; 麦肯锡最近的一份研究…

股东入股可用的出资形式主要有哪些

股东入股&#xff0c;可用的出资形式主要包括货币以及实物、知识产权、土地使用权等可以用货币估价并可以依法转让的非货币财产。 第一&#xff0c;货币。设立公司必然需要一定数量的流动资金。以支付创建公司时的开支和启动公司运营。因此&#xff0c;股东可以用货币出资。 第…

fully_connected与linear

1、tf.contrib.layers.fully_connected与tf.contrib.layers.linear的区别 tf.contrib.layers.fully_connected与tf.contrib.layers.linear实现一致&#xff0c;使用tf.contrib.layers.fully_connected一般将激活函数选项至None,因为线性变换不需要非线性变换&#xff0c;与此同…