首页 > 其他分享 >LCR 011. 连续数组(中等)(主站525)

LCR 011. 连续数组(中等)(主站525)

时间:2024-11-13 10:19:49浏览次数:3  
标签:LCR 前缀 idx nums int 主站 525 presum preSum

https://leetcode.cn/problems/A1NYOS/
https://leetcode.cn/problems/contiguous-array/
难度:☆☆☆☆

题目:

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

示例:

输入: nums = [0,1]
输出: 2
说明: [0, 1] 是具有相同数量 0 和 1 的最长连续子数组。

输入: nums = [0,1,0]
输出: 2
说明: [0, 1] (或 [1, 0]) 是具有相同数量 0 和 1 的最长连续子数组。

方法:数组,哈希表+前缀和

和LCR 010题不同的是:

  1. 本题的哈希表map,键为和,值为该和第一次出现的位置。
  2. 0和1的数量相同,等价于1的数量减去0的数量等于0,我们可将数组中0视作-1,则原问题转换为求最长的连续子数组,其元素和为0。LCR 010求的是和为k,本题可以看做和为0,即k=0。

Python1:两次遍历

  • 时间复杂度:O(n),其中n是nums的长度。
  • 空间复杂度:O(n)。
class Solution:
    def findMaxLength(self, nums: List[int]) -> int: 
        from collections import defaultdict
        # 构建前缀和
        n = len(nums)
        presum = [0] * (n + 1)
        for idx, val in enumerate(nums):
            if val == 1:
                presum[idx + 1] = presum[idx] + val
            else:
                presum[idx + 1] = presum[idx] - 1

        ret = 0
        dic = defaultdict(int)
        # 遍历前缀和
        for idx, val in enumerate(presum):
        	# 如果当前前缀和出现在字典中,说明该前缀和在前面出现过,不断添加n个元素后,前缀和不变
            # 说明中间的这n个元素和为0
            if val in dic:
                first_index = dic[val]
                ret = max(ret, idx - first_index)
            else:
                dic[val] = idx
        return ret

Python2:一次遍历
我们可以一边构建前缀和,一边遍历前缀和。

  • 时间复杂度:O(n),其中n是nums的长度。
  • 空间复杂度:O(n)。
class Solution:
    def findMaxLength(self, nums: List[int]) -> int: 
        from collections import defaultdict
        dic = defaultdict(int)
        ret, presum = 0, 0

        # LCR 010题在这里给的是1,因为那个题哈希表的值是个数
        # 本题是索引,而哈希表比数组多一位,第一个前缀和0的索引给-1
        dic[0] = -1  
        
        for idx, val in enumerate(nums):
            # 遍历数组,遇到1时,presum加1,遇到0时,presum减1
            if val == 1:
                presum += 1
            else:
                presum -= 1
            # 如果当前前缀和出现在字典中,说明该前缀和在前面出现过,不断添加n个元素后,前缀和不变
            # 说明中间的这n个元素和为0
            if presum in dic:
                first_index = dic[presum]
                ret = max(ret, idx - first_index)
            else:
                dic[presum] = idx
            
        return ret

Java1:两次遍历

  • 时间复杂度:O(n),其中n是nums的长度。
  • 空间复杂度:O(n)。
class Solution {
    public int findMaxLength(int[] nums) {
        int maxLength = 0;
        HashMap<Integer, Integer> map = new HashMap<>();
        int n = nums.length;
        int[] preSum = new int[n + 1];

        for (int i = 0; i < n; i++) {
            if (nums[i] == 1) {
                preSum[i + 1] = preSum[i] + nums[i];
            } else {
                preSum[i + 1] = preSum[i] - 1;
            }
        }
        
        for (int i = 0; i < preSum.length; i++) {
            if (map.containsKey(preSum[i])) {
                int firstIndex = map.get(preSum[i]);
                maxLength = Math.max(maxLength, i - firstIndex);
            } else {
                map.put(preSum[i], i);
            }
        }

        return maxLength;
    }
}

Java2:一次遍历

  • 时间复杂度:O(n),其中n是nums的长度。
  • 空间复杂度:O(n)。
class Solution {
    public int findMaxLength(int[] nums) {
        int maxLength = 0, preSum = 0;
        HashMap<Integer, Integer> map = new HashMap<>();
        map.put(0, -1);
        
        for (int i = 0; i < nums.length; i++) {
            // 遍历数组,遇到1时,presum加1,遇到0时,presum减1
            if (nums[i] == 1) {
                preSum += 1;
            } else {
                preSum -= 1;
            }

            if (map.containsKey(preSum)) {
                maxLength = Math.max(maxLength, i - map.get(preSum));
            } else {
                map.put(preSum, i);
            }
        }

        return maxLength;
    }
}

标签:LCR,前缀,idx,nums,int,主站,525,presum,preSum
From: https://blog.csdn.net/weixin_43606146/article/details/143729420

相关文章

  • P1525 NOIP2010 提高组 关押罪犯 题解
    Link:P1525NOIP2010提高组关押罪犯-洛谷分析首先题目给出了罪犯与罪犯之间的矛盾关系,这让我们可以想到图或并查集。然后,题目又说了要把罪犯分入两个监狱,也就是把罪犯看作点,要把这些点分入两个集合,这很自然地可以想到二分图。再然后,市长只会去看列表中的第一个事件的影响力......
  • LeetCode LCR135[报数]
    题目链接LeetCodeLCR135[报数]详情实例题解思路通过pow函数对10进行幂运算,来获取报数范围然后循环遍历通过push_back方法将数字加入到容器内代码classSolution{public:vector<int>countNumbers(intcnt){vector<int>iRetVec;......
  • leetcodeLCR 150. 彩灯装饰记录 II
    一棵圣诞树记作根节点为 root 的二叉树,节点值为该位置装饰彩灯的颜色编号。请按照从左到右的顺序返回每一层彩灯编号,每一层的结果记录于一行。示例1:输入:root=[8,17,21,18,null,null,6]输出:[[8],[17,21],[18,6]]提示:节点总数<=1000 /***Definitionfor......
  • SSM动漫论坛系统-计算机毕业设计源码52529
    目录1绪论1.1研究背景和意义1.2国内外研究现状1.3论文结构与章节安排1.4SSM框架介绍2 系统分析2.1可行性分析2.1.1技术可行性分析2.1.2经济可行性分析2.1.3操作可行性分析2.2系统功能分析2.2.1功能性分析2.2.2非功能性分析2.3 系统用例分......
  • [ACTF新生赛2020]usualCrypt
    [ACTF新生赛2020]usualCrypt总体分析点进byte_40E0E4函数界面,大概就能猜到解密与base64解密有关了点进sub_401080()函数确实是常见的base64加密但这里有两个自定义函数sub_401000()和sub_401030(a)sub_401000()intsub_401000(){inti;//eaxcharv1;//cl......
  • 2024CS 525 All SectionsProgramming
    AdvancedDatabaseOrganization-Fall2024CS525-AllSectionsProgrammingAssignmentIII:RecordManagerDue:Friday,October18th2024by23h59TaskThegoalofthisassignmentistoimplementasimplerecordmanager.Therecordmanagerhandlestablesw......
  • DeviceNet主站转EtherCAT协议转换网关
    一,设备主要功能捷米特JM-ECT-DNTM网关实现EtherCAT网络与DeviceNet网络之间的数据通讯,可连接DeviceNet网络到EtherCAT网络。即将DeviceNet设备连接到EtherCAT网络。应用广泛:本产品应用于支持DeviceNet接口的电机、IO模块、机器人、仪表、等等。例如半导体设备中的IO模块、M......
  • 【原创】RK3588/RK3568/RK3562平台 IgH EthercAT主站编译安装
    目录igh主站编译安装说明一、配置内核自带网卡驱动编译为模块1.内核配置编译内核编译内核模块二、交叉编译EtherCAT主站1.普通linux或preempt-rt1.1配置1.2编译1.3安装到TF卡根目录2.xenomai2.1交叉编译xenomai库2.2配置2.3编译2.4安装到TF卡根目录四、安装目录打......
  • 5253 铺地毯 枚举 模拟
    思路分析 1. 输入处理:程序首先读取地毯的数量n。然后依次读取每张地毯的信息,包括左下角坐标(a,b)和尺寸(c,d),并存储在数组中。 查询点的输入:读取要查询的点的坐标(x,y)。 3. 检查覆盖: 从最后一张地毯开始,依次向前检查每张地毯是否覆盖点(x,y)。 检查条......
  • crit: Microsoft.AspNetCore.Server.Kestrel[0] Unable to start Kestrel. Interop+Cr
    域名证书没有放在指定的位置错误信息crit:Microsoft.AspNetCore.Server.Kestrel[0]UnabletostartKestrel.Interop+Crypto+OpenSslCryptographicException:error:2006D080:BIOroutines:BIO_new_file:nosuchfileatInterop.Crypto.CheckValidOpenSslHandle(Saf......