剑指 Offer II 011. 0 和 1 个数相同的子数组

embedded/2025/1/31 19:11:17/

comments: true
edit_url: https://github.com/doocs/leetcode/edit/main/lcof2/%E5%89%91%E6%8C%87%20Offer%20II%20011.%200%20%E5%92%8C%201%20%E4%B8%AA%E6%95%B0%E7%9B%B8%E5%90%8C%E7%9A%84%E5%AD%90%E6%95%B0%E7%BB%84/README.md

剑指 Offer II 011. 0 和 1 个数相同的子数组

题目描述

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

 

示例 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

 

注意:本题与主站 525 题相同: https://leetcode.cn/problems/contiguous-array/

解法

方法一:哈希表 + 前缀和

我们可以将数组中的 0 0 0 视作 − 1 -1 1,那么可以将问题转化为求最长的连续子数组,其元素和为 0 0 0

我们使用哈希表记录每个前缀和第一次出现的位置。当我们枚举到位置 i i i 时,如果 s u m [ i ] sum[i] sum[i] 在哈希表中已经存在,那么以 i i i 结尾的最长连续子数组的长度为 i − d [ s u m [ i ] ] i - d[sum[i]] id[sum[i]],其中 d [ s u m [ i ] ] d[sum[i]] d[sum[i]] 表示前缀和 s u m [ i ] sum[i] sum[i] 第一次出现的位置,我们更新答案。如果 s u m [ i ] sum[i] sum[i] 在哈希表中不存在,我们将 s u m [ i ] sum[i] sum[i] 加入哈希表中。

时间复杂度 O ( n ) O(n) O(n),空间复杂度 O ( n ) O(n) O(n)。其中 n n n 是数组的长度。

Python3
class Solution:def findMaxLength(self, nums: List[int]) -> int:cnt={0:-1} #{sm:idx}:pre_sm[idx]=pre_smpresm_i=0res=0for j,x in enumerate(nums):presm_i+=(x if x else -1)  # 0->-1if presm_i in cnt: #说明可以与之前出现的 同值前缀和 抵消pre_i=cnt[presm_i] #前面 同值前缀和 对应索引res=max(res,j-pre_i) #此时pre_sm[j]-pre_sm[i]=0:区间sum(i,j]=0,长度=j-ielse:cnt[presm_i]=j #第一次出现presm_i的索引return res
Java
class Solution {public int findMaxLength(int[] nums) {Map<Integer, Integer> d = new HashMap<>();d.put(0, -1);int ans = 0, s = 0;for (int i = 0; i < nums.length; ++i) {s += nums[i] == 0 ? -1 : 1;if (d.containsKey(s)) {ans = Math.max(ans, i - d.get(s));} else {d.put(s, i);}}return ans;}
}
C++
class Solution {
public:int findMaxLength(vector<int>& nums) {unordered_map<int, int> d;d[0] = -1;int ans = 0, s = 0;int n = nums.size();for (int i = 0; i < n; ++i) {s += nums[i] ? 1 : -1;if (d.count(s)) {ans = max(ans, i - d[s]);} else {d[s] = i;}}return ans;}
};
Go
func findMaxLength(nums []int) (ans int) {d := map[int]int{0: -1}s := 0for i, x := range nums {if x == 1 {s++} else {s--}if j, ok := d[s]; ok {ans = max(ans, i-j)} else {d[s] = i}}return
}
TypeScript
function findMaxLength(nums: number[]): number {const d: Map<number, number> = new Map();d.set(0, -1);let ans = 0;let s = 0;const n = nums.length;for (let i = 0; i < n; ++i) {s += nums[i] === 0 ? -1 : 1;if (d.has(s)) {ans = Math.max(ans, i - d.get(s)!);} else {d.set(s, i);}}return ans;
}
Swift
class Solution {func findMaxLength(_ nums: [Int]) -> Int {var d: [Int: Int] = [0: -1]var ans = 0var s = 0for i in 0..<nums.count {s += nums[i] == 0 ? -1 : 1if let prevIndex = d[s] {ans = max(ans, i - prevIndex)} else {d[s] = i}}return ans}
}

http://www.ppmy.cn/embedded/158433.html

相关文章

Jenkins下载 Maven、Allure 插件并且配置环境

文章目录 Jenkins在插件中心下载 maven、allure插件maven插件下载allure插件下载 配置maven、allure 往期推荐&#xff1a; 最新! 在 Linux上搭建Jenkins环境! Jenkins邮件通知的详细配置含邮件通知模板&#xff01; Jenkin配置企业微信通知 Jenkins在插件中心下载 maven、…

PostgreSQL图插件AGE

PostgreSQL图插件AGE Apache AGE是PostgreSQL的一个图插件&#xff0c;作为Apache的一个顶级项目目前备受关注。AGE是A Graph Extension的缩写&#xff0c;支持openCypher语言&#xff0c;本文关注下它的基础架构。 1、AGE中涉及的几个系统表 AGE中涉及几个重要的系统表&#x…

Windows11暂停自动更新

Windows11在设置页的暂停自动更新选项最大值只能设置为7天&#xff0c;我们通过修改注册表来实现永久暂停更新。 步骤一&#xff1a;打开注册表 按Win键打开Windows搜索界面&#xff0c;在搜索栏中输入Reg&#xff0c;选择注册表编辑器并打开。 步骤二&#xff1a;修改注册表…

【uniapp】获取上传视频的md5,适用于APP和H5

代码实现 APP端使用 uni.getFileInfo() 即可 H5环境需要安装spark-md5 npm install spark-md5封装的获取上传视频的md5方法 import SparkMD5 from spark-md5/*** 用于获取视频的md5* param {Object} e 要上传的文件* param {Object} digestAlgorithm 取值 md5、sha1*/ expor…

针对业务系统的开发,如何做需求分析和设计?

个人认为第一步最重要的还是定义问题的边界范围,所有的问题讨论都要回归到边界里面 前台架构设计流程 小中台架构的设计流程 中台本质是2B类产品,我们以数据相关小中台举例的2B类产品和技术的几个思考(后面有详细的案例): 中台本质与2B类产品的技术思考 中台本质上是面…

DeepSeek-R1 模型及GRPO算法学习

总结DeepSeek-R1 模型算法&#xff0c;并对其中的GRPO算法做一些学习补充。 DeepSeek-R1 论文总结 提出了通过强化学习提升大语言模型推理能力的方法&#xff0c;开发出 DeepSeek-R1-Zero 和 DeepSeek-R1 模型&#xff0c;在多个推理任务上表现出色&#xff0c;并开源模型推动…

IDEA构建JavaWeb项目,并通过Tomcat成功运行

目录 一、Tomcat简介 二、Tomcat安装步骤 1.选择分支下载 2.点击下载zip安装包 3.解压到没有中文、空格和特殊字符的目录下 4.双击bin目录下的startup.bat脚本启动Tomcat 5.浏览器访问Tomcat 6.关闭Tomcat服务器 三、Tomcat目录介绍 四、WEB项目的标准结构 五、WEB…

单片机串口打印printf函数显示内容(固件库开发)

1.hal_usart.c 文件 #include <stdio.h> #include "hal_usart.h" #include "stm32F10x.h"//**要根据 使用的是哪个串口 对应修改 串口号 eg&#xff1a;USART1** void USART_PUTC(char ch) {/* 等待数据寄存器为空 */while((USART1->SR & …