• 剑指 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

    前缀和,只记录最早的presum出现的位置,若再次出现相同值,下标相减就是连续区间长度

    nums[i] == 0: presum += -1;

    nums[i] == 1: presum += 1;

    可以保证当前最长连续区间,证明无

    class Solution {
    public:
        int findMaxLength(vector<int>& nums) {
            unordered_map<int, int> vis;
            int presum = 0;
            int ans = 0;
            vis[0] = 1;
            for(int i = 0; i < nums.size(); i++)
            {
                if(nums[i] == 0)
                    presum += -1;
                else presum += 1;
                if(vis[presum])
                {
                    ans = max(ans, i + 2 - vis[presum]);
                }
                else
                    vis[presum] = i + 2;
            }
            return ans;
    
    
    
        }
    };
  • 相关阅读:
    LeetCode 029 Divide Two Integers
    LeetCode 028 Implement strStr()
    Linux网络技术管理及进程管理
    RAID磁盘阵列及CentOS7系统启动流程
    Linux磁盘管理及LVM讲解(1)
    逻辑卷管理
    Linux磁盘管理及LVM讲解
    Linux计划任务及压缩归档
    Linux权限管理
    用户及用户组管理
  • 原文地址:https://www.cnblogs.com/WTSRUVF/p/16094861.html
Copyright © 2020-2023  润新知