码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 面试算法11:0和1个数相同的子数组


    题目

    输入一个只包含0和1的数组,请问如何求0和1的个数相同的最长连续子数组的长度?例如,在数组[0,1,0]中有两个子数组包含相同个数的0和1,分别是[0,1]和[1,0],它们的长度都是2,因此输出2。

    分析

    首先把输入数组中所有的0都替换成-1,那么题目就变成求包含相同数目的-1和1的最长子数组的长度。在一个只包含数字1和-1的数组中,如果子数组中-1和1的数目相同,那么子数组的所有数字之和就是0,因此这个题目就变成求数字之和为0的最长子数组的长度。

    和前面的解法类似,可以在扫描数组时累加已经扫描过的数字之和。如果数组中前i个数字之和为m,前j个数字(j>i)之和也为m,那么从第i+1个数字到第j个数字的子数组的数字之和为0,这个和为0的子数组的长度是j-i。

    如果扫描到数组的第j个数字并累加得到前j个数字之和m,那么就需要知道是否存在一个i(i<j)使数组中前i个数字之和也为m。可以把数组从第1个数字开始到当前扫描的数字累加之和保存到一个哈希表中。由于我们的目标是求出数字之和为0的最长子数组的长度,因此还需要知道第1次出现累加之和为m时扫描到的数字的下标。因此,哈希表的键是从第1个数字开始累加到当前扫描到的数字之和,而值是当前扫描的数字的下标。

    解

    public class Test {
        public static void main(String[] args) {
            int[] nums = {0, 1, 0};
            int result = findMaxLength(nums);
            System.out.println(result);
        }
    
        public static int findMaxLength(int[] nums) {
            Map<Integer, Integer> sumToIndex = new HashMap<>();
            sumToIndex.put(0, -1);// 存储的是sum和index的对应关系
            int sum = 0;
            int maxLength = 0;
            for (int i = 0; i < nums.length; i++) {
                sum += nums[i] == 0 ? -1 : 1;
                if (sumToIndex.containsKey(sum)) {
                    maxLength = Math.max(maxLength, i - sumToIndex.get(sum));
                }
                else {
                    sumToIndex.put(sum, i);
                }
            }
    
            return maxLength;
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
  • 相关阅读:
    古有愚公移山,今有冤种搬家~某人含泪写完了搬家脚本~~
    Java部署到服务器接口404(本地可以正常访问)
    Scrapy与分布式开发(2.3):lxml+xpath基本指令和提取方法详解
    如何设置跨域隔离启用 SharedArrayBuffer
    高等数学刷题
    Java下打印一个等腰三角型
    后端开发总结(1):前后端数据传输
    Day810.MySQL调优之事务:高并发场景下的数据库事务调优 -Java 性能调优实战
    shell学习脚本04(小滴课堂)
    你和特斯拉CEO马斯克之间只相差一款优秀的计划管理工具飞项
  • 原文地址:https://blog.csdn.net/GoGleTech/article/details/133068028
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号