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就是变相的来记录了,所以不需要单独再次记录,当前想单独写也没问题。
相关文章:
LeetCode:689. 三个无重叠子数组的最大和(dp C++)
目录 689. 三个无重叠子数组的最大和 题目描述: 实现代码与解析: dp 原理思路: 滑动窗口: 原理思路: 689. 三个无重叠子数组的最大和 题目描述: 给你一个整数数组 nums 和一个整数 k ,找…...

Leetcode—206.反转链表【简单】
2023每日刷题(三十三) Leetcode—206.反转链表 头插法实现代码 /*** Definition for singly-linked list.* struct ListNode {* int val;* struct ListNode *next;* };*/ struct ListNode* reverseList(struct ListNode* head) {if(head NULL…...
Linux - 内存 - 预留内存占用分析
说明 Linux启动log中会显示平台的内存信息,公司SOC平台,物理DRAM实际size是128M,但是启动log中total size不足128MB,并且预留内存(82272K reserved)过多,启动log如下: Memory: 480…...

Java学习之路 —— Java高级
文章目录 前言1. 单元测试2. 反射2.1 获取Class对象的三种方式2.2 获取类的构造器的方法2.3 获取类的成员变量2.4 获取类的成员方法2.5 反射的作用 3. 注解3.1 自定义注解3.2 注解的原理3.3 元注解3.4 注解的解析 4. 动态代理5. 总结 前言 终于走到新手村的末端了,…...

git使用及常用命令
在初入公司中,若使用的是git管理工具,需要做以下步骤: 1,常用命令在: (1),git config --global user.name xxx(名字) //若不设置 那么下次提交代码时会报错 其次该设置名字和…...
vue 学习 -- day36(分析工程结构)
//引入的不再是Vue构造函数了,引入的是一个名为createApp的工厂函数 import { createApp } from vue import App from ./App.vue //创建应用实例对象——app(类似于之前Vue2中的vm,但app比vm更“轻”,它少了很多属性和方法) const app creat…...

SQL Injection
SQL Injection SQL injection(SQL注入),通过在输入字段或URL查询参数中执行SQL命令,导致对数据库的未经授权的访问。如果SQL注入成功,未经授权的人可能会读取、创建、更新甚至删除数据库表的记录 举个例子:…...

【Go入门】 Go搭建一个Web服务器
【Go入门】 Go搭建一个Web服务器 前面小节已经介绍了Web是基于http协议的一个服务,Go语言里面提供了一个完善的net/http包,通过http包可以很方便的搭建起来一个可以运行的Web服务。同时使用这个包能很简单地对Web的路由,静态文件,…...

VS 将 localhost访问改为ip访问
项目场景: 使用vs进行本地调试时需要多人访问界面,使用ip访问报错 问题描述 vs通过ip访问报错 虚拟机或其它电脑不能正常打开 原因分析: 原因是vs访问规则默认是iis,固定默认启动地址是localhost 解决方案: 1.vs项目启动之后会出现这个 右…...
app使用
font-face{font-family:‘kaishu’; src: url(data:application/font-ttf;charsetutf-8;base64,AAEAAAASAQAABAAgRFNJR5PpVzIAAAEsAAAacEdTVUIzhvftAAAbnAAAAXBPUy8yY8pHoQAAHQwAAABWY21hcAsTB9YAAB1kAADD5GN2dCAvAiIAADhSAAAA5pmcGdt/siFHQAA5OQAAAOiZ2FzcAAXAAkAAOiIAAAAEGds…...

【迅搜01】安装运行并测试XunSearch
安装运行并测试XunSearch 这回的新系列,我们将学习到的是一个搜索引擎 迅搜 XunSearch 的使用。这个搜索引擎在 PHP 圈可能还是有一点名气的,而且也是一直在更新的,虽说现在 ElasticSearch 已经是实际上的搜索引擎霸主了,而且还有…...

Mac电脑VSCode配置PHP开发环境
1.安装 PHP 首先,打开终端,安装 Homebrew,输入如下命令: $ /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" 安装了 Homebrew 之后,你可以使用下面的…...

SpirngBoot + Vue 前后端分离开发工具代码
✅作者简介:大家好,我是Leo,热爱Java后端开发者,一个想要与大家共同进步的男人😉😉 🍎个人主页:Leo的博客 💞当前专栏: Java从入门到精通 ✨特色专栏…...

【数据结构初阶】单链表(附全部码源)
单链表 1,单链表的概念及结构2,单链表的实现2.1初始化内容(所需文件,接口)2.2申请结点2.3打印单链表2.4尾插2.5头插2.6尾删2.7头删2.8查找2.9在pos位置之后插入2.10在pos位置前面插入2.11删除pos之后的值2.12删除pos位…...

数据治理入门
处理模式 模式名称常见场景常见框架批处理夜间几个小时,无人值守hive spark datax流处理7*24H一直运行,无人值守maxwell, flink, flume, kafka即席处理人机交互接口访问 web页面 数据治理的意义 数据质量低:数据错误,不准确或不…...

uniapp 微信小程序登录 新手专用 引入即可
预览 第一步导入插件 在引入的页面的登录按钮下拷贝一下代码 <template><view class"content"><button type"primary" click"login">微信登录</button></view><TC-WXlogin :wxloginwxlogin /> </templ…...

PMCW体制雷达系列文章(4) – PMCW雷达之抗干扰
说明 本文作为PMCW体制雷达系列文章之一,主要聊聊FMCW&PMCW两种体制雷达的干扰问题。事实上不管是通信领域还是雷达领域,对于一切以电磁波作为媒介的信息传递活动,干扰是无处不在的。近年来,随着雷达装车率的提高,…...

Gin框架源码解析
概要 目录 Gin路由详解 Gin框架路由之Radix Tree 一、路由树节点 二、请求方法树 三、路由注册以及匹配 中间件含义 Gin框架中的中间件 主要讲述Gin框架路由和中间件的详细解释。本文章将从Radix树(基数树或者压缩前缀树)、请求处理、路由方法树…...
MacOS设置JAVA_HOME环境变量
首先先查看一下,系统当前使用的java是谁,可以使用/usr/libexec/java_home命令 % /usr/libexec/java_home /Library/Internet Plug-Ins/JavaAppletPlugin.plugin/Contents/Home检查一下这个路径下的文件,发现这是一个jre的目录。加上-V参数看…...
闭眼检测实现
引言 这段代码是一个实时眼睛状态监测程序,可以用于监测摄像头捕获的人脸图像中的眼睛状态,判断眼睛是否闭合。具体应用实现作用说明如下: 1. 实时监测眼睛状态 通过摄像头捕获的实时视频流,检测人脸关键点并计算眼睛的 EAR&a…...
RestClient
什么是RestClient RestClient 是 Elasticsearch 官方提供的 Java 低级 REST 客户端,它允许HTTP与Elasticsearch 集群通信,而无需处理 JSON 序列化/反序列化等底层细节。它是 Elasticsearch Java API 客户端的基础。 RestClient 主要特点 轻量级ÿ…...

聊聊 Pulsar:Producer 源码解析
一、前言 Apache Pulsar 是一个企业级的开源分布式消息传递平台,以其高性能、可扩展性和存储计算分离架构在消息队列和流处理领域独树一帜。在 Pulsar 的核心架构中,Producer(生产者) 是连接客户端应用与消息队列的第一步。生产者…...

汽车生产虚拟实训中的技能提升与生产优化
在制造业蓬勃发展的大背景下,虚拟教学实训宛如一颗璀璨的新星,正发挥着不可或缺且日益凸显的关键作用,源源不断地为企业的稳健前行与创新发展注入磅礴强大的动力。就以汽车制造企业这一极具代表性的行业主体为例,汽车生产线上各类…...

微信小程序 - 手机震动
一、界面 <button type"primary" bindtap"shortVibrate">短震动</button> <button type"primary" bindtap"longVibrate">长震动</button> 二、js逻辑代码 注:文档 https://developers.weixin.qq…...
Java多线程实现之Callable接口深度解析
Java多线程实现之Callable接口深度解析 一、Callable接口概述1.1 接口定义1.2 与Runnable接口的对比1.3 Future接口与FutureTask类 二、Callable接口的基本使用方法2.1 传统方式实现Callable接口2.2 使用Lambda表达式简化Callable实现2.3 使用FutureTask类执行Callable任务 三、…...

Module Federation 和 Native Federation 的比较
前言 Module Federation 是 Webpack 5 引入的微前端架构方案,允许不同独立构建的应用在运行时动态共享模块。 Native Federation 是 Angular 官方基于 Module Federation 理念实现的专为 Angular 优化的微前端方案。 概念解析 Module Federation (模块联邦) Modul…...

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

Android15默认授权浮窗权限
我们经常有那种需求,客户需要定制的apk集成在ROM中,并且默认授予其【显示在其他应用的上层】权限,也就是我们常说的浮窗权限,那么我们就可以通过以下方法在wms、ams等系统服务的systemReady()方法中调用即可实现预置应用默认授权浮…...

如何在网页里填写 PDF 表格?
有时候,你可能希望用户能在你的网站上填写 PDF 表单。然而,这件事并不简单,因为 PDF 并不是一种原生的网页格式。虽然浏览器可以显示 PDF 文件,但原生并不支持编辑或填写它们。更糟的是,如果你想收集表单数据ÿ…...
Android第十三次面试总结(四大 组件基础)
Activity生命周期和四大启动模式详解 一、Activity 生命周期 Activity 的生命周期由一系列回调方法组成,用于管理其创建、可见性、焦点和销毁过程。以下是核心方法及其调用时机: onCreate() 调用时机:Activity 首次创建时调用。…...