前缀和实例5(连续数组)

news2024/12/23 14:11:30

题目:

给定一个二进制数组 nums , 找到含有相同数量的 0 和 1 的最长连续子数组,并返回该子数组的长度。

示例 1:

输入: nums = [0,1]
输出: 2
说明: [0, 1] 是具有相同数量 0 和 1 的最长连续子数组。

示例 2:

输入: nums = [0,1,0]
输出: 2
说明: [0, 1] (或 [1, 0]) 是具有相同数量0和1的最长连续子数组。

提示:

  • 1 <= nums.length <= 105
  • nums[i] 不是 0 就是 1

算法原理:

题目要求找出⼀段连续的区间,其中0和1出现的次数相等

如果将0转成-1,1还是1,题目就转化成找出最长的⼀段区间,且这段区间的和等于 0

前缀和算法就可以快速求出某一区域内所有元素的和

枚举所有子数组可以每次固定起始的位置,依次向后枚举,所以我们当然可以每次固定末尾的位置,依次向前枚举

i是每次固定的末尾位置,从i位置开始依次向前枚举可以枚举出i位置开始的所有子数组,题目要求最长的且和为0的区间,所以我们每次只需要选出i位置开始所有子数组中满足要求的最优子数组即可,标准就是:在[0,i-1]的区间内找到第一次出现sum的位置ji-j就是本轮i位置能够枚举的所有子数组中满足要求的最优(最长)子数组

前缀和+哈希表:

哈希表记录前缀和出现的位置 (只记录每个前缀和第一次出现时的位置)

1 计算出当前位置的前缀和 

2 在[0,i-1](即前面的区域内)寻找第一次出现的前缀和为sum的位置j ,因为每轮都要寻找以i位置开始向前枚举的所有子数组中满足条件的最长子数组,也就是长度i-j,若是寻找的不是第一次出现的前缀和为sum的位置,那么长度i-j相较于原始的i-j只会减小,不会是最优解子数组的长度

3 判断是否需要记录当前前缀和为sum的位置

   若是当前位置的前缀和是第一次出现,则记录它此时的位置

   若不是第一次出现,则无需记录了,因为在前面已经有了sum了,且那个位置的sum一定比现在位置的sum靠前,且我们要求的是最长连续子数组,每轮能够枚举的所有子数组中满足条件的最长子数组长度是i-j,所以j越靠前越好

4 细节:

当前位置的前缀和若为0,即[0,i]的整个区域就是本轮i位置所有枚举出的子数组中和为0的最长子数组,长度为i-j,即前缀和为0时要记录的下标是-1,也就是j为-1

代码实现:

class Solution 
{
public:
    int findMaxLength(vector<int>& nums) 
    {
        //问题转化为求和为0的最长子数组
        unordered_map<int,int> hash;//统计每个前缀和第一次出现的位置
        hash[0] = -1;// 默认有⼀个前缀和为 0 的情况
        int sum = 0;
        int ret = 0;
        for(int i = 0;i<nums.size();i++)
        {
            sum+=nums[i]==0?-1:1;// 计算当前位置的前缀和
            if(hash.count(sum))
            {
                ret = max(ret,i-hash[sum]);
            }
            else
            {
                hash[sum] = i;
            }
        }
    return ret;
    }
};

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

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

相关文章

Exception in thread “main“ java.sql.SQLException: No suitable driver

详细报错信息如下&#xff1a; Exception in thread "main" java.sql.SQLException: No suitable driver at java.sql.DriverManager.getDriver(DriverManager.java:315) at org.apache.spark.sql.execution.datasources.jdbc.JDBCOptions.$anonfun$driverC…

js遍历对象属性的方法

在 JavaScript 中&#xff0c;有许多方法可以遍历对象的属性&#xff0c;但在性能上并没有显著的差异。对于大多数用例&#xff0c;使用 for-in 循环或 Object.keys() 方法是最常见的。 然而&#xff0c;如果你正在寻找微优化&#xff0c;并希望遍历大量对象&#xff0c;可以考…

数字孪生需要自建3D模型?搞懂Blender建模要点,看这篇文章就够了!

1. Blender的基础介绍 关于城市大师的建模软件&#xff0c;一般推荐使用Blender。一是因为Blender是开源免费的&#xff0c;不会有经济负担&#xff0c;二是因为我们软件有针对Blender的插件&#xff0c;对其进行了一定程度上的补充。 【温馨提示】如果使用的是3Dmax或者maya…

Zabbix“专家坐诊”第205期问答汇总

问题一 Q&#xff1a;Zabbix6.0安装出错&#xff0c;未找到zabbix-server的配置文件。 A&#xff1a;Find / -name zabbix-server.conf&#xff0c;试一下 Q&#xff1a;找到了。 Q&#xff1a;配置好了&#xff0c;虚拟化平台监控还是不行。 A&#xff1a;因为虚拟化监控用的…

PL/SQL+cpolar公网访问内网Oracle数据库

文章目录 前言1. 数据库搭建2. 内网穿透2.1 安装cpolar内网穿透2.2 创建隧道映射 3. 公网远程访问4. 配置固定TCP端口地址4.1 保留一个固定的公网TCP端口地址4.2 配置固定公网TCP端口地址4.3 测试使用固定TCP端口地址远程Oracle 前言 Oracle&#xff0c;是甲骨文公司的一款关系…

python生成Markdown文件

我们使用的库是markdown_strings pip install markdown_strings程序如下&#xff1a; from markdown_strings import header, table, code_blockwith open("mark_down.md", w, encoding"utf8") as file:file.write(header("一级目录", 1) &qu…

python抓取网页视频

1. 喜马拉雅音频 1-1 喜马拉雅 import requests import json import time import random import hashliburl https://www.ximalaya.com/revision/play/v1/audio?id46103875&ptype1headers { user-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.3…

法线贴图的原理和作用

在上一篇文章中详细介绍了位移贴图的相关知识&#xff0c;在本章中我们继续讲述法线贴图的相关概念&#xff0c;文章后面继续用GLTF 编辑器 来演示下法线贴图的模型渲染效果。 1、什么是法线贴图 法线贴图&#xff08;Normal Map&#xff09;是一种纹理映射技术&#xff0c;用…

DAY04_瑞吉外卖——文件上传下载菜品新增菜品分页查询菜品修改

目录 1. 文件上传下载1.1 上传介绍1.1.1 概述1.1.2 前端介绍1.1.3 服务端介绍 1.2 下载介绍1.3 上传代码实现1.3.1 前端代码1.3.2 服务端实现1.3.3 测试 1.4 下载代码实现1.4.1 前端代码1.4.2 服务端代码1.4.3 测试 2. 菜品新增2.1 需求分析2.2 数据模型2.3 准备工作2.4 前端页…

golang工程——底层原理【defer、panic、recover、interface】

defer 延时性 不管defer函数后的执行路径如何&#xff0c;最终都将被执行。在Go语言中&#xff0c;defer一般被用于资源的释放及异常panic的处理。保证函数在任意路径执行结束后都能够关闭资源。defer是一种优雅的关闭资源的方式&#xff0c;能减少大量冗余的代码并避免由于忘…

Python 标准库之pathlib,路径操作

背景 pathlib 标准库是在 Python3.4 引入&#xff0c;到现在最近版 3.11 已更新了好几个版本&#xff0c;主要是用于路径操作&#xff0c;相比之前的路径操作方法 os.path 有一些优势&#xff0c;有兴趣的同学可以学习下 **官方文档&#xff1a;**https://docs.python.org/zh-…

应用架构的演进:亚马逊的微服务实践

当你在亚马逊上购物时,或许不会想到,你看到的这个购物网站,其背后技术架构经历了什么样的变迁与升级。 还记得上世纪 90 年代,那个只卖书的网上书店吗?那时的亚马逊,不过是一个架构简单的网站,所有的功能都堆积在一个庞大的软件堡垒里。随着更多业务的增加、更新和迭代,这个软…

RS232,485,422的定义及区别

计算机与计算机或计算机与终端之间的数据传送可以采用串行通讯和并行通讯二种方式。 由于串行通讯方式具有使用线路少、成本低&#xff0c;特别是在远程传输时&#xff0c;避免了多条线路特性的不一致而被广泛采用。串口按电气标准及协议来划分&#xff0c;包括RS232、RS422、R…

JavaScript位运算的妙用

位运算的妙用: 奇偶数, 色值换算,换值, 编码等 位运算的基础知识: 操作数是32位整数自动转化为整数在二进制下进行运算 一.按位与& 判断奇偶数: 奇数: num & 1 1偶数: num & 1 0 基本知识: 用法&#xff1a;操作数1 & 操作数2规则&#xff1a;有 0 则为…

WhaleStudio 分钟级构建 AI 模型,强大 Ops 能力简化模型调度与部署

什么是机器学习(ML)? 它有什么作用 机器学习(ML)是人工智能(AI)的一个子集&#xff0c;通过算法发现数据中的通用模式&#xff0c;并根据持续不断的训练来优化调整最终结果。ML模型从过去的经验中学习&#xff0c;并根据已有的经验进行预测。例如&#xff0c;现在的电商已不再…

外贸人如何一眼识别骗子

最近收到很多客户在平台上直接发过来一些压缩包&#xff0c;然后说自己是和某个国家的政府签订的合作方案&#xff0c;请查看这些压缩包里的图纸和附件是否能够提供&#xff0c;麻烦核算价格等等。 当我看到客户发过来这些东西的时候&#xff0c;第一反应不是打开附件或者是来…

React中为啥key不可以使用索引值index?(超详细版本)

索引值index与唯一标识符id区别 1、索引值index是表示列表中每个元素的位置&#xff1b; 特点&#xff1a;从0开始&#xff0c;在列表变化时react重新分配索引值&#xff0c;造成索引值与元素标签的对应关系不是稳定的一一对应。 const list ["apple", "bana…

掌握Vim编辑器,轻松提升编程效率

1. 什么是VIM Vim (Vi improved)是从 Vi 发展出来的一个文本编辑器&#xff0c;简单的来说&#xff0c;Vi 是老式的文本处理器&#xff0c;功能已经很齐全了&#xff0c;但还是有可以进步的地方。 之后&#xff0c;Vim 之父 Bram Moolenaar 在 Vi 的源代码基础上进行了修改&a…

链式二叉树(二叉树看这一篇就够了)

顾名思义就是使用链式存储来实现的二叉树,因为二叉树是递归定义的,所以二叉树的实现中,都是会使用递归来完成.这里面需要一些前置的二叉树理论知识,对这部分不是很理解的可以先看下这篇二叉树的概念. 下面开始进入正题了: 1.二叉树的创建 假定现有"ABD##E#H##CF##G##&quo…

PDF文件压缩软件 PDF Squeezer mac中文版​软件特点

PDF Squeezer mac是一款macOS平台上的PDF文件压缩软件&#xff0c;可以帮助用户快速地压缩PDF文件&#xff0c;从而减小文件大小&#xff0c;使其更容易共享、存储和传输。PDF Squeezer使用先进的压缩算法&#xff0c;可以在不影响文件质量的情况下减小文件大小。 PDF Squeezer…