数据结构与算法:子数组最大累加和问题及扩展

前言

子数组最大累加和问题看似简单,但能延伸出的题目非常多,千题千面,而且会和其他算法结合出现。

一、最大子数组和

class Solution {
public:int maxSubArray(vector<int>& nums) {int n=nums.size();vector<int>dp(n);//i位置往左能延伸出的最大累加和dp[0]=nums[0];int ans=dp[0];for(int i=1;i<n;i++){dp[i]=max(nums[i],dp[i-1]+nums[i]);ans=max(ans,dp[i]);}return ans;}//扩展问题://求子数组最大累加和的left、right和sumint left;int right;int sum;void extra(vector<int>&nums){sum=INT_MIN;for(int l=0,r=0,pre=INT_MIN;r<nums.size();r++){if(pre>=0)//前面累加和收益为正 -> 不换开头{pre+=nums[r];}else//换开头{pre=nums[r];l=r;}if(pre>sum)//更新{sum=pre;left=l;right=r;}}}
};

这个就是经典的子数组最大累加和问题,这个和扩展问题求left和right非常重要,是整个子数组最大累加和专题的基础!!

对于dp表的定义就是必须以i位置结尾,往左的子数组最大累加和。那么对于每个位置,都是当前的数加上要之前的和不要之前的两种情况。

那么如果要求这个子数组的left和right,整体过程类似滑动窗口,就是在空间压缩的基础上,如果之前的累加和大于等于零,说明收益是正的,那就保留之前的,否则就不要之前的,然后把l更新到r位置。当累加和能更新最大值,就连着left和right一起更新。

二、打家劫舍

class Solution {
public:int rob(vector<int>& nums) {int n=nums.size();if(n==1){return nums[0];}if(n==2){return max(nums[0],nums[1]);}vector<int>dp(n);dp[0]=nums[0];dp[1]=max(nums[0],nums[1]);for(int i=2;i<n;i++){dp[i]=max(dp[i-1],max(nums[i],dp[i-2]+nums[i]));//dp[i]=max(dp[i-1],dp[i-2]+nums[i]);}return dp[n-1];}
};

这个题首先要注意的就是特例,当只有一间或者两间的话直接返回。

之后就是分情况讨论,如果上间偷了,这间就不能偷,那么依赖的就是dp[i-1];如果上间没偷,那么就还有要之前的和不要之前的两种情况,最后取三种情况最大值即可。

其实因为这个题每间房子的收益都是大于零的,那么就不用讨论不要之前的这种情况了。

三、环形子数组的最大和

class Solution {
public:int maxSubarraySumCircular(vector<int>& nums) {int n=nums.size();int sum=nums[0],maxSum=nums[0],minSum=nums[0];int maxpre=nums[0],minpre=nums[0];for(int i=1;i<n;i++){sum+=nums[i];//统计总累加和maxpre=max(nums[i],maxpre+nums[i]);maxSum=max(maxSum,maxpre);minpre=min(nums[i],minpre+nums[i]);minSum=min(minSum,minpre);}return sum==minSum?maxSum:max(maxSum,sum-minSum);//防止都扣掉}
};

这个题就需要点转化了,转化的思路就是,由于是环形数组,那么在其中删除任意一段子数组,剩下的仍连续,那么就可以将最大累加和转化成总体累加和减去最小的累加和和最大累加和的最大值。

整体的依赖关系还是要之前的和不要之前的,但这里要统计最大累加和和最小累加和。注意,若整体累加和等于最小累加和,为了防止把数全扣了,此时要返回最大累加和,否则就是最大累加和和相减后的最大值。

四、打家劫舍 II

class Solution {
public:int rob(vector<int>& nums) {int n=nums.size();if(n==1){return nums[0];}vector<int>dp(n);//不偷第0间 -> 1~n-1dp[0]=0;dp[1]=nums[1];for(int i=2;i<=n-1;i++){dp[i]=max(dp[i-1],max(nums[i],dp[i-2]+nums[i]));}int p1=dp[n-1];//偷第0间 -> nums[0]+2~n-2fill(dp.begin(),dp.end(),0);dp[0]=nums[0];dp[1]=nums[0];//注意!!!只偷第0间时dp[

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

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

相关文章

MIT6.828 Lab3-2 Print a page table (easy)

实验内容 实现一个函数来打印页表的内容&#xff0c;帮助我们更好地理解 xv6 的三级页表结构。 修改内容 kernel/defs.h中添加函数声明&#xff0c;方便其它函数调用 void vmprint(pagetable_t);// lab3-2 Print a page tablekernel/vm.c中添加函数具体定义 采用…

2025高频面试设计模型总结篇

文章目录 设计模型概念单例模式工厂模式策略模式责任链模式 设计模型概念 设计模式是前人总结的软件设计经验和解决问题的最佳方案&#xff0c;它们为我们提供了一套可复用、易维护、可扩展的设计思路。 &#xff08;1&#xff09;定义&#xff1a; 设计模式是一套经过验证的…

Java基础:面向对象进阶(二)

01-static static修饰成员方法 static注意事项&#xff08;3种&#xff09; static应用知识&#xff1a;代码块 static应用知识&#xff1a;单列模式 02-面向对象三大特征之二&#xff1a;继承 什么是继承&#xff1f; 使用继承有啥好处? 权限修饰符 单继承、Object类 方法重…

Spring框架如何做EhCache缓存?

在Spring框架中&#xff0c;缓存是一种常见的优化手段&#xff0c;用于减少对数据库或其他资源的访问次数&#xff0c;从而提高应用性能。Spring提供了强大的缓存抽象&#xff0c;支持多种缓存实现&#xff08;如EhCache、Redis、Caffeine等&#xff09;&#xff0c;并可以通过…

NVIDIA显卡

NVIDIA显卡作为全球GPU技术的标杆&#xff0c;其产品线覆盖消费级、专业级、数据中心、移动计算等多个领域&#xff0c;技术迭代贯穿架构创新、AI加速、光线追踪等核心方向。以下从技术演进、产品矩阵、核心技术、生态布局四个维度展开深度解析&#xff1a; 一、技术演进&…

【BUG】生产环境死锁问题定位排查解决全过程

目录 生产环境死锁问题定位排查解决过程0. 表面现象1. 问题分析&#xff08;1&#xff09;数据库连接池资源耗尽&#xff08;2&#xff09;数据库锁竞争(3) 代码实现问题 2. 分析解决(0) 分析过程&#xff08;1&#xff09;优化数据库连接池配置&#xff08;2&#xff09;优化数…

【计算机网络应用层】

文章目录 计算机网络应用层详解一、前言二、应用层的功能三、常见的应用层协议1. HTTP/HTTPS&#xff08;超文本传输协议&#xff09;2. DNS&#xff08;域名系统&#xff09;3. FTP&#xff08;文件传输协议&#xff09;4. SMTP/POP3/IMAP&#xff08;电子邮件协议&#xff09…

Linux 虚拟化方案

一、Linux 虚拟化技术分类 1. 全虚拟化 (Full Virtualization) 特点&#xff1a;Guest OS 无需修改&#xff0c;完全模拟硬件 代表技术&#xff1a; KVM (Kernel-based Virtual Machine)&#xff1a;主流方案&#xff0c;集成到 Linux 内核 QEMU&#xff1a;硬件模拟器&…

树莓派 5 换清华源

首先备份原设置 cp /etc/apt/sources.list ~/sources.list.bak cp /etc/apt/sources.list.d/raspi.list ~/raspi.list.bak修改配置 /etc/apt/sources.list 文件替换内容如下&#xff08;原内容删除&#xff09; deb https://mirrors.tuna.tsinghua.edu.cn/debian/ bookworm …

WGAN原理及实现(pytorch版)

WGAN原理及实现 一、WGAN原理1.1 原始GAN的缺陷1.2 Wasserstein距离的引入1.3 Kantorovich-Rubinstein对偶1.4 WGAN的优化目标1.4 数学推导步骤1.5 权重裁剪 vs 梯度惩罚1.6 优势1.7 总结 二、WGAN实现2.1 导包2.2 数据加载和处理2.3 构建生成器2.4 构建判别器2.5 训练和保存模…

Unity网络开发基础 (3) Socket入门 TCP同步连接 与 简单封装练习

本文章不作任何商业用途 仅作学习与交流 教程来自Unity唐老狮 关于练习题部分是我观看教程之后自己实现 所以和老师写法可能不太一样 唐老师说掌握其基本思路即可,因为前端程序一般不需要去写后端逻辑 1.认识Socket的重要API Socket是什么 Socket&#xff08;套接字&#xff0…

【linux】一文掌握 ssh和scp 指令的详细用法(ssh和scp 备忘速查)

文章目录 入门连接执行SCP配置位置SCP 选项配置示例ProxyJumpssh-copy-id SSH keygenssh-keygen产生钥匙类型known_hosts密钥格式 此快速参考备忘单提供了使用 SSH 的各种方法。 参考&#xff1a; OpenSSH 配置文件示例 (cyberciti.biz)ssh_config (linux.die.net) 入门 连…

真实笔试题

文章目录 线程题树的深度遍历 线程题 实现一个类支持100个线程同时向一个银行账户中存入一元钱.需通过同步机制消除竞态条件,当所有线程执行完成后,账户余额必须精确等于100元 package com.itheima.thread;public class ShowMeBug {private double balance; // 账户余额priva…

2.2 路径问题专题:LeetCode 63. 不同路径 II

动态规划解决LeetCode 63题&#xff1a;不同路径 II&#xff08;含障碍物&#xff09; 1. 题目链接 LeetCode 63. 不同路径 II 2. 题目描述 一个机器人位于 m x n 网格的左上角&#xff0c;每次只能向右或向下移动一步。网格中可能存在障碍物&#xff08;标记为 1&#xff…

2874. 有序三元组中的最大值 II

给你一个下标从 0 开始的整数数组 。nums 请你从所有满足 的下标三元组 中&#xff0c;找出并返回下标三元组的最大值。 如果所有满足条件的三元组的值都是负数&#xff0c;则返回 。i < j < k(i, j, k)0 下标三元组 的值等于 。(i, j, k)(nums[i] - nums[j]) * nums[k…

【论文笔记】Llama 3 技术报告

Llama 3中的顶级模型是一个拥有4050亿参数的密集Transformer模型&#xff0c;并且它的上下文窗口长度可以达到128,000个tokens。这意味着它能够处理非常长的文本&#xff0c;记住和理解更多的信息。Llama 3.1的论文长达92页&#xff0c;详细描述了模型的开发阶段、优化策略、模…

JVM深入原理(一+二):JVM概述和JVM功能

目录 1. JVM概述 1.1. Java程序结构 1.2. JVM作用 1.3. JVM规范和实现 2. JVM功能 2.1. 功能-编译和运行 2.2. 功能-内存管理 2.3. 功能-即时编译 1. JVM概述 1.1. Java程序结构 1.2. JVM作用 JVM全称是Java Virtual Machine-Java虚拟机 JVM作用:本质上是一个运行在…

SQL Server Integration Services (SSIS) 服务无法启动

问题现象&#xff1a; 安装 SQL Server 2022 后&#xff0c;SQL Server Integration Services (SSIS) 服务无法启动&#xff0c;日志报错 “服务无法响应控制请求”&#xff08;错误代码 1067&#xff09;或 “依赖服务不存在或已标记为删除”。 快速诊断 检查服务状态与依赖项…

Spring Boot 定时任务的多种实现方式

&#x1f31f; 前言 欢迎来到我的技术小宇宙&#xff01;&#x1f30c; 这里不仅是我记录技术点滴的后花园&#xff0c;也是我分享学习心得和项目经验的乐园。&#x1f4da; 无论你是技术小白还是资深大牛&#xff0c;这里总有一些内容能触动你的好奇心。&#x1f50d; &#x…

Java基础之反射的基本使用

简介 在运行状态中&#xff0c;对于任意一个类&#xff0c;都能够知道这个类的所有属性和方法&#xff1b;对于任意一个对象&#xff0c;都能够调用它的任意属性和方法&#xff1b;这种动态获取信息以及动态调用对象方法的功能称为Java语言的反射机制。反射让Java成为了一门动…