前缀和(7)_连续数组

news2024/9/30 10:06:34

个人主页:C++忠实粉丝
欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 C++忠实粉丝 原创

前缀和(7)_连续数组

收录于专栏【经典算法练习】
本专栏旨在分享学习算法的一点学习笔记,欢迎大家在评论区交流讨论💌

目录

1. 题目链接 :

2. 题目描述 :

3. 解法(一维前缀和) :

    算法思路 :

   示例说明:

    代码展示 :

    结果分析:

 


1. 题目链接 :

OJ链接: 连续数组

2. 题目描述 :

给定一个二进制数组 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

3. 解法(一维前缀和) :

    算法思路 :

转换 0 和 1:

将 0 视作 - 1,而 1 保持不变。这意味着在计算前缀和时,0 会减少总和。
这样,当某段区间内的 0 和 1 数量相同时,前缀和将回到相同的值。

计算前缀和:

遍历数组时,维护一个变量 sum 用来表示当前的前缀和。
如果在某个位置的 sum 值与之前某个位置的 sum 值相同,说明从这两个位置之间的元素(即子数组)中,0 和 1 的数量相等。

使用哈希表记录前缀和的索引:

使用一个哈希表 dp 来存储每个前缀和第一次出现的索引。
初始化 dp[0] = -1,表示前缀和为 0 的情况下,虚拟的索引是 - 1,这有助于处理从数组起始位置开始的有效子数组。

判断条件:

在遍历数组时,每当计算新的前缀和 sum:
        如果 sum 已经在 dp 中存在(即 dp.count(sum) 为真),这意味着从 dp[sum] + 1 到当前索引 i 的这段区间中,0 和 1 的数量相等。
        通过计算当前索引 i 与 dp[sum] 的差值得到这段子数组的长度:i - dp[sum]。

   示例说明:

假设有一个数组 nums = [0, 1, 0, 1],我们可以按以下步骤分析前缀和的变化:

初始状态:

dp = { 0: -1 }
sum = 0
ret = 0

遍历数组:

i = 0, nums[0] = 0:
        sum = 0 + (-1) = -1
        dp[-1] 不存在,所以将 dp[-1] = 0。
i = 1, nums[1] = 1 :
    sum = -1 + 1 = 0
    dp[0] 已存在,表示从 dp[0] + 1 到 i 的子数组有相同数量的 0 和 1,长度为 1 - (-1) = 2,更新 ret = 2。

 i = 2, nums[2] = 0 :
    sum = 0 + (-1) = -1
    dp[-1] 已存在,长度为 2 - 0 = 2,ret 不变。

i = 3, nums[3] = 1 :
    sum = -1 + 1 = 0
    dp[0] 已存在,长度为 3 - (-1) = 4,更新 ret = 4。

    代码展示 :

class Solution {
public:
    int findMaxLength(vector<int>& nums) {
        unordered_map<int, int> dp;
        dp[0] = -1;
        int sum = 0, ret = 0;
        for(int i = 0; i < nums.size(); i++)
        {
            sum += nums[i] == 0 ? -1 : 1;
            if(dp.count(sum)) ret = max(ret, i - dp[sum]);
            else dp[sum] = i;
        } 
        return ret;
    }
};

 

    结果分析:

时间复杂度和空间复杂度
时间复杂度 :O(n),其中n 是数组的长度。我们只遍历数组一次。
空间复杂度 :O(n),在最坏情况下,哈希表可能存储所有的前缀和。

 

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

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

相关文章

使用python进行自然语言处理的示例

程序功能 分词&#xff1a;将输入句子拆分为单词。 词性标注&#xff1a;为每个单词标注其词性。 命名实体识别&#xff1a;识别命名实体&#xff08;如人名、地名、组织等&#xff09;。 这段代码展示了如何用 nltk 进行基础的 NLP 任务&#xff0c;包括分词、词性标注和命名…

17、CPU缓存架构详解高性能内存队列Disruptor实战

1.CPU缓存架构详解 1.1 CPU高速缓存概念 CPU缓存即高速缓冲存储器&#xff0c;是位于CPU与主内存间的一种容量较小但速度很高的存储器。CPU高速缓存可以分为一级缓存&#xff0c;二级缓存&#xff0c;部分高端CPU还具有三级缓存&#xff0c;每一级缓存中所储存的全部数据都是…

动态规划算法专题(一):斐波那契数列模型

目录 1、动态规划简介 2、算法实战应用【leetcode】 2.1 题一&#xff1a;第N个泰波那契数 2.1.1 算法原理 2.1.2 算法代码 2.1.3 空间优化原理——滚动数组 2.1.4 算法代码——空间优化版本 2.2 题二&#xff1a;三步问题 2.2.1 算法原理 2.2.2 算法代码 2.3 题二&a…

数据集-目标检测系列-鼠检测数据集 mouse >> DataBall

数据集-目标检测系列-鼠检测数据集 mouse >> DataBall 数据集-目标检测系列-老鼠检测数据集 mouse 数据量&#xff1a;6k 想要进一步了解&#xff0c;请联系。 DataBall 助力快速掌握数据集的信息和使用方式&#xff0c;会员享有 百种数据集&#xff0c;持续增加中。…

高效互动随心畅谈语聊大厅语音聊天系统小程序源码

高效互动随心畅谈 —— 语聊大厅语音聊天系统全解析 &#x1f389; 初识语聊大厅&#xff1a;语音社交的新大陆 在这个快节奏的数字时代&#xff0c;文字聊天似乎已经无法满足我们对即时互动和真实情感交流的需求。而“高效互动随心畅谈语聊大厅语音聊天系统”的出现&#xff…

TiDB 在线打标签实现副本调度应用实践

作者&#xff1a; 数据源的TiDB学习之路 原文来源&#xff1a; https://tidb.net/blog/4e14596a 案例背景 某原有系统为虚拟机环境部署&#xff0c;整体性能不满足预期。为提升集群整体性能&#xff0c;计划分阶段采购物理机&#xff0c;并以扩缩容的方式逐渐把物理机添加到…

如何从 Windows 11/10/8.1/8/7 中恢复已删除的视频

不小心删除了视频或格式化了 SD 卡/硬盘&#xff1f;没有备份已删除的视频&#xff1f;不要担心&#xff0c;我们有一个解决方案 可以恢复 Windows 11、10 中已删除的视频并处理这种可怕的情况。 但是&#xff0c;在详细介绍如何恢复已删除的视频和视频恢复应用程序之前&#…

【AI论文精读1】针对知识密集型NLP任务的检索增强生成(RAG原始论文)

目录 一、简介一句话简介作者、引用数、时间论文地址开源代码地址 二、摘要三、引言四、整体架构&#xff08;用一个例子来阐明&#xff09;场景例子&#xff1a;核心点&#xff1a; 五、方法 &#xff08;架构各部分详解&#xff09;5.1 模型1. RAG-Sequence Model2. RAG-Toke…

docker安装Portainer CE

docker安装Portainer CE 教程 1、简介 Portainer 是一款开源的容器管理工具&#xff0c;旨在帮助用户更轻松地管理 Docker 环境。无论您是 Docker 新手还是经验丰富的开发人员&#xff0c;Portainer 都提供了直观的用户界面&#xff0c;使您能够方便地创建、部署和监控容器。…

抖去推数字人---技术本地服务器技术开发步骤

AI数字人制作流程大致可以分为以下几个关键步骤&#xff1a; 虚拟形象设计&#xff1a;设计虚拟人物的外观和特征&#xff0c;可以手工完成&#xff0c;也可以利用计算机图形学和机器学习算法自动生成。 驱动/动作捕捉&#xff1a;使用动作捕捉技术记录真实演员的动作&#xf…

Rust Web自动化Demo

1.新建项目 使用RustCover新建项目&#xff0c;目录如下&#xff1a; Cargo.toml文件 [package] name "Demo" version "0.1.0" edition "2021"[dependencies] tokio { version "1", features ["full"] } thirtyfour…

【Android 源码分析】Activity短暂的一生 -- 目录篇 (持续更新)

1. 前言 忽然有一天&#xff0c;我想要做一件事&#xff1a;去代码中去验证那些曾经被“灌输”的理论。                                                                                  …

光电开关应用设计讨论

一. 检测原理 光电开关由一个发光管和一个光敏二极管或三极管组成。其原理很简单&#xff0c;发光二极管发出的光传递到光敏三极管&#xff0c;再转换成电信号。如图1所示&#xff0c;LED为发射端&#xff0c;正向电流IF越大&#xff0c;发射光的强度就越大&#xff1b;PT为接…

【小程序】微信小程序课程 -4 项目实战

目录 1、 效果图 2、创建项目 2.1 创建小程序端 2.1.1 先创建纯净项目 2.1.2 删除components 2.1.4 删除app.json红色部分 2.1.5 删除index.json红色部分 2.1.6 删除index.wxss全部内容 2.1.7 删除index.wxml全部内容 2.1.8 app.json创建4个页面 2.1.9 app.json添加…

【拥抱AIGC】通义灵码网络代理配置

在公司网络环境下&#xff0c;无法访问公共网络时&#xff0c;可在插件端配置网络代理后使用通义灵码。 配置网络代理 公司网络通常使用 HTTP 代理服务器在网络流量发送到目标位置之前进行拦截&#xff0c;以便检测可疑流量或者限制进入公司内网络的内容。如果你使用的公司网…

【Python报错已解决】 NameError: name ‘scio‘ is not defined

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 专栏介绍 在软件开发和日常使用中&#xff0c;BUG是不可避免的。本专栏致力于为广大开发者和技术爱好者提供一个关于BUG解决的经…

Star 3w+,向更安全、更泛化、更云原生的 Nacos3.0 演进

作者&#xff1a;席翁 Nacos 社区刚刚迎来了 Star 突破 30000 的里程碑&#xff0c;从此迈上了一个新的阶段。感谢大家的一路支持、信任和帮助&#xff01; Nacos /nɑ:kəʊs/是 Dynamic Naming and Configuration Service 的首字母简称&#xff0c;定位于一个更易于构建云原…

c++就业磁盘链式b树与b+树

linux上/a.out启动一个进程 最上面是内核 在heap里 一个节点只想左子树 另一个节点指向右子树 找到根节点 对比找 磁盘寻址过程 对比次数多了之后 找下一个节点次数变多 磁盘面-道-区 一个节点4k 不断在磁盘上寻址 开叉 中间存储数据 b树 所有的叶子节点在同一层 b树 所有节点…

Llama 3.1 技术研究报告-7

7.6 图像识别结果 我们评估了 Llama 3 在⼀系列任务上的图像理解能⼒&#xff0c;这些任务涵盖了⾃然图像理解、⽂本理解、图表理解和多模态推理&#xff1a; MMMU (Yue 等⼈&#xff0c;2024a) 是⼀个具有挑战性的数据集&#xff0c;⽤于多模态推理&#xff0c;模型需要理解…

tesseract:一个.Net版本的开源OCR项目

推荐一个.Net版本的开源OCR项目&#xff0c;方便我们在项目中集成OCR功能。 01 项目简介 tesseract是针对Tesseract-OCR&#xff08;C&#xff09;引擎封装的.NET版本&#xff0c;支持超过100种语言的文本识别&#xff0c;使得.NET开发者能够轻松地利用Tesseract的强大功能&a…