【数据结构-前缀哈希】力扣3026. 最大好子数组和

给你一个长度为 n 的数组 nums 和一个 正 整数 k 。

如果 nums 的一个
子数组
中,第一个元素和最后一个元素 差的绝对值恰好 为 k ,我们称这个子数组为 好 的。换句话说,如果子数组 nums[i…j] 满足 |nums[i] - nums[j]| == k ,那么它是一个好子数组。

请你返回 nums 中 好 子数组的 最大 和,如果没有好子数组,返回 0 。

示例 1:
输入:nums = [1,2,3,4,5,6], k = 1
输出:11
解释:好子数组中第一个元素和最后一个元素的差的绝对值必须为 1 。好子数组有 [1,2] ,[2,3] ,[3,4] ,[4,5] 和 [5,6] 。最大子数组和为 11 ,对应的子数组为 [5,6] 。

示例 2:
输入:nums = [-1,3,2,4,5], k = 3
输出:11
解释:好子数组中第一个元素和最后一个元素的差的绝对值必须为 3 。好子数组有 [-1,3,2] 和 [2,4,5] 。最大子数组和为 11 ,对应的子数组为 [2,4,5] 。

示例 3:
输入:nums = [-1,-2,-3,-4], k = 2
输出:-6
解释:好子数组中第一个元素和最后一个元素的差的绝对值必须为 2 。好子数组有 [-1,-2,-3] 和 [-2,-3,-4] 。最大子数组和为 -6 ,对应的子数组为 [-1,-2,-3] 。
在这里插入图片描述

暴力求解(超时)

class Solution {
public:long long maximumSubarraySum(vector<int>& nums, int k) {vector<long long> group(nums.size());long long sum = 0;for(int i = 0;i < nums.size(); i++){sum += nums[i];group[i] = sum;}long long ans = INT_MIN;bool flag = false;for(int i = 0;i < nums.size()-1;i++){for(int j = i+1;j < nums.size();j++){if(abs(nums[j] - nums[i]) == k){flag = true;ans = max(ans, group[j] - (i > 0 ? group[i-1] : 0));}}}if(!flag){ans = 0;}return ans;}
};

在这里插入图片描述
暴力方法超时。

前缀和 + 哈希

class Solution {
public:long long maximumSubarraySum(vector<int>& nums, int k) {long long ans = LLONG_MIN, sum = 0;unordered_map<int,long long> group;//枚举jfor(int x : nums){auto it = group.find(x - k);if(it != group.end()){ans = max(ans, sum + x - it->second);}it = group.find(x + k);if(it != group.end()){ans = max(ans, sum + x - it->second);}it = group.find(x);if(it == group.end() || sum < it->second){group[x] = sum;}sum += x;}return ans == LLONG_MIN ? 0 : ans;}
};

时间复杂度:O(n)
空间复杂度:O(n)

首先是通过变形来转换问题,在上一个解法中,需要枚举i,在for中继续枚举j,来找出nums[j] - nums[i] = k的情况。这样使得时间复杂度很高,这时候可以想到,由于哈希表有非常强的查找性能,时间复杂度为O(1),所以可以将问题转换成枚举 j,然后通过 nums[j] - k来找到nums[i]。

我们将nums[i]储存在哈希表的键, 这时候我们就可以快速来找到对应的nums[i],然后那么哈希表的值就可以用来储存nums[i]的前缀和。并且我们要让符合条件的子段和尽可能大,所以nums[i]的前缀和要尽可能小,所以在储存nums[i]的前缀和的时候,如果有比他小的前缀和,就将哈希表中对应的值替换成最小的前缀和。

需要注意的是,在解法2中,另前缀和s[0] = 0,这也意味着这次子段和的计算方式不是s[j] - s[i-1],而是s[j+1] - s[i],也就是前缀和的索引方式整体往右挪了一位。

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

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

相关文章

性能测试学习笔记

一、性能测试是什么&#xff1f; 1.生活案例&#xff1a; 学校选课系统&#xff0c;就会经常崩溃&#xff01;&#xff01;&#xff01;&#xff01; 2.性能测试的定义 测试人员借助测试工具&#xff0c;模拟系统在不同场景下&#xff0c;对应的性能指标是否达到预期 3.性能…

Spring -- 事务

Spring中事务的操作分为两类:(1)编程式事务 – 手动写代码操作事务(2)声明式事务 – 利用注解开启事务和提交事务 1. 编程式事务 准备Controller RestController RequestMapping("/user") public class UserInfoController {Autowiredprivate UserInfoService use…

JAVA开发学习-day21

JAVA开发学习-day21 1. 删除表单数据 根据ElementUI的官方组件指南&#xff0c;为表单每列的数据添加删除按钮 <el-table :data"tableData" style"width: 100%"><el-table-column prop"id" label"ID" width"180"…

SpringBoot基础(一):快速入门

SpringBoot基础系列文章 SpringBoot基础(一)&#xff1a;快速入门 目录 一、SpringBoot简介二、快速入门三、SpringBoot核心组件1、parent1.1、spring-boot-starter-parent1.2、spring-boot-dependencies 2、starter2.1、spring-boot-starter-web2.2、spring-boot-starter2.3、…

Visual Studio 和 Visual Studio Code 的比较与应用偏向

Visual Studio 和 Visual Studio Code&#xff08;VS Code&#xff09;是微软开发的两个不同的开发工具&#xff0c;各有特点和优势&#xff0c;适用于不同的开发需求。下面是详细的比较和在实际应用中的偏向。 功能和特性 Visual Studio 完整的IDE&#xff1a;支持多种编程…

海外短剧小程序 ,竖屏会员付费看剧系统搭建paypal,stripe对接支付功能

目录 前言&#xff1a; 一、系统功能 二、系统常见问题 总结&#xff1a; 前言&#xff1a; 在全球化的今天&#xff0c;短剧作为一种新兴的内容形式&#xff0c;正迅速赢得国际观众的心。尤其是海外市场的短剧推广&#xff0c;正成为内容创作者和营销者的新宠。本文将深入…

Adobe Substance 3D Sampler v4.2.2.3719 解锁版下载及安装教程(3D材质管理软件)

前言 Substance 3D Sampler简称“Sa”是一款由Adobe新推出的3D真实材质贴图制作软件。允许用户通过调整和混合现有材料&#xff0c;或通过扫描&#xff08;单个或多个图像&#xff09;中提取新材料来创建和迭代材料集合&#xff0c;从而轻松将真实的图片转换为具有真实感的表面…

JavaEE从入门到起飞 (三) ~AOP

晚上好&#xff0c;愿这深深的夜色给你带来安宁&#xff0c;让温馨的夜晚抚平你一天的疲惫&#xff0c;美好的梦想在这个寂静的夜晚悄悄成长。 目录 文章目录 前言 了解面向切面编程&#xff08;AOP&#xff09; 什么是面向切面编程&#xff08;AOP&#xff09;&#xff1f…

二、Matlab图像处理基础

文章目录 一、Matlab图像处理工具箱二、图像文件的读取2.1 文件信息的读取2.2 图像文件的读取2.3 图像文件的保存2.4 图像文件的显示2.5 像素信息的显示 本章知识点总结 一、Matlab图像处理工具箱 在帮助文档可以搜索到图像处理工具箱的介绍 二、图像文件的读取 2.1 文件信息…

回归评价指标

这里写目录标题 1. 均方误差MSE2. 均方根误差RMSE3. 平均绝对误差MAE4. R^2^5. 调整后R^2^ 1. 均方误差MSE 回归数据和原始数据误差的平方和/原始数据个数平方的原因&#xff1a;不平方正负误差会抵消&#xff0c;对大误差更为敏感&#xff0c;在一些场景下更能凸显出模型预测…

41.【C语言之外】聊聊Cheat Engine官方教程步骤6的思考

0.看前须知 有一定指针概念的基础 推荐阅读前几篇博文&#xff1a; 19.【C语言】指针&#xff08;重难点&#xff09;&#xff08;A&#xff09; 37.【C语言】指针&#xff08;重难点&#xff09;&#xff08;B&#xff09; 38.【C语言】指针&#xff08;重难点&#xff09…

【python】模块包

前言 模块化是python中的重要知识。随着我们接触的工程项目变得越来越大时&#xff0c;就需要把我们的运行代码进行拆解以便我们检查和项目的推进。有些时候&#xff0c;几个程序都需要同一个功能&#xff0c;那python就提供一种方法&#xff0c;把需要重复利用的代码放在同一…

Spring Boot 3.x Web MVC实战:实现流缓存的request

上一节《Spring Boot 3.x Filter实战&#xff1a;记录请求日志》实践最后遇到了request对象的流不可重复读的问题&#xff0c;本小节我们将通过流数据缓存以及流的装饰器模式来解决这个问题。如果觉得对你有帮助&#xff0c;记得点赞收藏&#xff0c;关注小卷&#xff0c;后续更…

Linux部署MySQL8.0

目录 一、部署前准备1.1、查看系统版本和位数&#xff08;32位或64位&#xff09;1.2、下载对应安装包 二、开始部署1、将安装包解压并且移动到目标安装目录2、准备MySQL数据和日志等存储文件夹3、准备MySQL配置文件 my.cnf4、创建mysql单独用户组和用户&#xff0c;将安装目录…

<数据集>灭火器识别数据集<目标检测>

数据集格式&#xff1a;VOCYOLO格式 图片数量&#xff1a;3262张 标注数量(xml文件个数)&#xff1a;3262 标注数量(txt文件个数)&#xff1a;3262 标注类别数&#xff1a;1 标注类别名称&#xff1a;[extinguisher] 使用标注工具&#xff1a;labelImg 标注规则&#xf…

无人机培训机构推广运营理论技术

一、市场定位与品牌建设 在无人机培训行业的激烈竞争中&#xff0c;精准的市场定位是成功的第一步。首先&#xff0c;需明确目标学员群体&#xff0c;如航拍爱好者、农业植保服务者、应急救援人员或专业无人机操作员等。基于目标群体的需求&#xff0c;构建差异化的品牌形象。…

FlexBV电路查看软件

FlexBV - Macbook, iPhone, PC/Laptop & Electronics BoardViewer with PDF Cross Referencing 免费。 支持tvw&#xff0c;cad格式。 支持Windows,Linux,Mac。 而且我发现cad格式是文本的&#xff01;意味着可以自由编辑&#xff01;

git拉取代码出现“remote: The project you were looking for could not be found.”错误分析

git拉取代码出现“remote: The project you were looking for could not be found.”错误分析 如果输入的远程地址正确&#xff0c;那么极大可能是用户未登录或多个用户登录无法正确获取你想要的用户&#xff0c;如下图所示&#xff0c; 由于之前有同事在我电脑登录git账号&a…

leetcode 103.二叉树的锯齿形层序遍历

1.题目要求: 给你二叉树的根节点 root &#xff0c;返回其节点值的 锯齿形层序遍历 。&#xff08;即先从左往右&#xff0c;再从右往左进行下一层遍历&#xff0c;以此类推&#xff0c;层与层之间交替进行&#xff09;。2.做题思路:由题我们可以判断&#xff0c;树中每到偶数…

spring过滤器和拦截器的区别

1出身不同。 过滤器来自servlet&#xff0c;拦截器来自spring框架。 2触发时机 不同请求的执行顺序是&#xff1a;请求进入容器 > 进入过滤器 > 进入 Servlet > 进入拦截器 > 执行控制器 过滤器先执行&#xff0c;会在servlet请求之前和相应之后进行处理。 拦…