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

leetcode 525. 连续数组(优质解法)

代码:

class Solution {public int findMaxLength(int[] nums) {HashMap<Integer,Integer> hashMap=new HashMap<>();hashMap.put(0,-1);int max_length=0;int last=0; //上一个下标的前缀和int now=0;  //当前下标的前缀和for(int i=0;i<nums.length;i++){int num=nums[i]==0?-1:1;    //获取当前的数据,0要视为-1now=last+num;int j=hashMap.getOrDefault(now,-2); if(j!=-2){max_length=Math.max(max_length,i-j);}else{hashMap.put(now,i);}last=now;}return max_length;}
}

题解:

        本题我们要找到有相同数量 0 和 1 的最长子数组,要是直接按原题这种数据来解题的话是比较困难的,对于该题我们应该换一个思路,把 0 视为 -1,那么我们要找的就是有相同数量 -1 和 1 的最长子数组,那么子数组的和就为 0 , 我们要找的就是和为 0 的最长子数组

        对于找子数组的题通常使用滑动窗口和前缀和,一般数组中具有单调性就使用滑动窗口,涉及到子数组的和就使用前缀和,很显然本题可以通过前缀和来解决

        为了方便分析,我画了如下的图:

        sum 是前缀和数组,记录对应下标的前缀和。要寻找以 i 为尾,符合条件的子数组,加上在 0 ~ i -1 区间找到了下标 j ,j +1 - i 的子数组是符合条件的,那么 x = 0 ,并且 x= sum[ i ] - sum[ j ] ,推得:sum[ i ] = sum[ j ] ,所以要想获得 j 下标,就要判断 i 下标之前有多少下标的前缀和等于 sum[ i ] 

        可以将 i 下标之前下标的前缀和存放到哈希表中,由于本题要获取的是最长子数组,所以在哈希表中以下标的前缀和为 key ,下标为 value,可以通过 j 下标与 i 下标的距离得到符合条件的子数组的长度

        将前缀和以及下标存储到哈希表中时可能会出现冲突,我们要考虑如何解决,当不同的下标对应相同的前缀和时,应该存储较小的下标,因为较小的下标离 i 下标较远,得到的子数组长度更长

        在使用 前缀和+哈希表 的解题方法时,哈希表一般都需要先填入一个初始数据,我们通过示例 1 来进行分析,nums=[ 0,1 ]

        i 下标一开始指向 0 ,当数据是 0 时视为 -1,所以此时的前缀和为 -1,要在哈希表中找的 key 值就是 -1,哈希表中没有,于是准备遍历下一个数据,在遍历之前先将当前下标的前缀和以及下标填入哈希表,

0        1        hash

i                        

        i 此时指向 1 ,前缀和为 0 ,所以在哈希表中找的 key 值就是 0,哈希表中没有,但是我们知道以当前位置为末尾是有符合条件的子数组的,就是 0,1,通过上面画的图知道,子数组的长度为 i - j ,此时符合条件的子数组长度为 2 ,i 为 1,所以 j 为 -1,所以我们要在哈希表在填入的初始数据为 (0,-1)

0        1        hash

           i            -1,0

        上述便是本题的核心思想

相关文章:

  • 使用包、Crate 和模块管理项目(下)
  • 性能压力测试--确保企业数字化业务稳健运行
  • 前端:NPM的介绍和使用
  • 杰发科技AC7840——在Eclipse环境下使用Jlink调试
  • SSM整合实战(Spring、SpringMVC、MyBatis)
  • 大模型赋能“AI+电商”,景联文科技提供高质量电商场景数据
  • flowable工作流学习笔记
  • 针对这两个趋势,3.0全新新零售商业模式可以采取以下策略:
  • 【WeLink群消息机器人webhook介绍】
  • 将Abp默认事件总线改造为分布式事件总线
  • OpenSSL 3.2.0新增Argon2支持——防GPU暴力攻击
  • 【Linux】macOS下使用scp命令编写脚本上传文件至服务器
  • 字符函数和字符串函数(2)
  • 飞天使-k8s知识点3-卸载yum 安装的k8s
  • IDEA tomcat内存不足
  • (十五)java多线程之并发集合ArrayBlockingQueue
  • 【从零开始安装kubernetes-1.7.3】2.flannel、docker以及Harbor的配置以及作用
  • 【干货分享】SpringCloud微服务架构分布式组件如何共享session对象
  • 【跃迁之路】【585天】程序员高效学习方法论探索系列(实验阶段342-2018.09.13)...
  • 0x05 Python数据分析,Anaconda八斩刀
  • Android Volley源码解析
  • AzureCon上微软宣布了哪些容器相关的重磅消息
  • gitlab-ci配置详解(一)
  • IDEA 插件开发入门教程
  • JavaScript学习总结——原型
  • redis学习笔记(三):列表、集合、有序集合
  • springboot_database项目介绍
  • Storybook 5.0正式发布:有史以来变化最大的版本\n
  • 解析 Webpack中import、require、按需加载的执行过程
  • 警报:线上事故之CountDownLatch的威力
  • 前端学习笔记之原型——一张图说明`prototype`和`__proto__`的区别
  • mysql面试题分组并合并列
  • Spark2.4.0源码分析之WorldCount 默认shuffling并行度为200(九) ...
  • 第二十章:异步和文件I/O.(二十三)
  • # Apache SeaTunnel 究竟是什么?
  • #define用法
  • #Lua:Lua调用C++生成的DLL库
  • $.ajax()
  • ( 用例图)定义了系统的功能需求,它是从系统的外部看系统功能,并不描述系统内部对功能的具体实现
  • (13)Hive调优——动态分区导致的小文件问题
  • (草履虫都可以看懂的)PyQt子窗口向主窗口传递参数,主窗口接收子窗口信号、参数。
  • (独孤九剑)--文件系统
  • (多级缓存)多级缓存
  • (附源码)springboot高校宿舍交电费系统 毕业设计031552
  • (附源码)ssm基于微信小程序的疫苗管理系统 毕业设计 092354
  • (六)软件测试分工
  • (每日持续更新)jdk api之FileFilter基础、应用、实战
  • (三)Hyperledger Fabric 1.1安装部署-chaincode测试
  • (十一)图像的罗伯特梯度锐化
  • (原創) 如何將struct塞進vector? (C/C++) (STL)
  • (转)大道至简,职场上做人做事做管理
  • ******之网络***——物理***
  • .NET 跨平台图形库 SkiaSharp 基础应用
  • .NET 线程 Thread 进程 Process、线程池 pool、Invoke、begininvoke、异步回调
  • .Net通用分页类(存储过程分页版,可以选择页码的显示样式,且有中英选择)