当前位置: 首页 > news >正文

leetcode 525 连续数组

一、题目描述

二、解题思路

整体思路

将数组中所有的0换成-1,找到含相同数量的0和1的最长连续子数组就可以转换为求和为0的子数组。枚举出以i位置为结尾的和为0的子数组,采用前缀和+哈希表的方法来解决这个问题。思路类似leetcode560和为K的子数组leetcode974和可被K整除的子数组

具体思路

要找出以i位置为结尾的和为0的子数组,即找出[0,i-1]内以和为sum-0,即和为sum的子数组,如图所示:

有以下细节问题需要注意:

(1)哈希表unordered_map<int,int>hash的键是前缀和,值是下标

(2)前缀和加入哈希表的时机:

在计算i位置之前,哈希表里面只保存[0,i-1]区间的前缀和,所以,在完成if判断后,在将i位置的前缀和加入哈希表

(3)子数组的长度为i-hash[sum],而不是i-hash[sum]+1,因为前缀和包含了右端点;

(4)如果整个向量的前缀和为0,为了避免出界,我们需要初始化hash[0]=-1

(5)由于是求最长子数组的长度,所以如果键sum已经存在,则无需再更新hash[sum]的值,因为越靠左边,子数组长度越长;如果键sum不存在,则使得hash[sum]=i;

三、代码实现

时间复杂度:T(n)=O(n)

空间复杂度:S(n)=O(n)

class Solution {
public:int findMaxLength(vector<int>& nums) {//前缀和+哈希表unordered_map<int,int> hash;hash[0]=-1;int sum=0,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.dtcms.com/a/355837.html

相关文章:

  • 可改善能源利用水平、削减碳排放总量,并为可再生能源规模化发展提供有力支撑的智慧能源开源了
  • 计算机组成原理3-3-5:定点数的乘法运算——补码阵列乘法器
  • init.usb.configfs.rc的USB动态配置
  • 算法学习笔记:双指针_滑动窗口专题
  • STM32CubeMX 6.15.0 + CLion
  • 3.渗透-.IP地址-详解
  • AI批量抠图工具,无需付费,永久使用
  • 报错记录 Error: CUDNN_STATUS_BAD_PARAM; Reason: finalize_internal()
  • 仓颉编程语言青少年基础教程:输入输出
  • Vue 自定义筛选组件:3 种全选反选场景的优雅实现
  • Groovy闭包语法详解
  • 【MySQL数据库入门课程】开课啦!
  • 一个是“内容生成器”,一个是“知识管理器”:VibeVoice 与 NoteBookLM 优劣对决?
  • 《零基础入门AI:YOLO目标检测模型详解(从基础概念到YOLOv1核心原理)》
  • Vue模版:Ant-design模态框弹窗
  • vue3的setup
  • 基于离散小波变换(DWT)的数字水印Matlab
  • @Indexed注解的作用
  • 整理3点结构点与点之间的距离
  • Paimon——官网阅读:非主键表
  • 基于pytorch的垃圾分类识别项目实战
  • Qt|QElapsedTimer 的使用详解
  • H5小游戏-超级马里奥
  • 【涂鸦T5】2. 光感bh1750
  • 效率飙升200%:Appsmith开发结合cpolar远程访问实战解析
  • 前端面试题2(vue)
  • 高并发内存池(14)- PageCache回收内存
  • Go 语言常用命令使用与总结
  • 【Agent】AutoAgent: A Fully-Automated and Zero-Code Framework for LLM Agents
  • 从零开始:手写数字识别程序的深度学习实践