列表

详情


NC321. 连续数组的长度

描述

给定一个仅由0,1构成的整数数组nums,请返回0和1个数相同的最长子数组的长度。

示例1

输入:

[0,1]

输出:

2

说明:

数组中0,1的个数相同且子数组最长为原数组

示例2

输入:

[0,0,1,0,0,0,1,1]

输出:

6

说明:

从第3个数到第8个数构成的子数组中0,1的个数相同且该子数组最长

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C 解法, 执行用时: 13ms, 内存消耗: 2308KB, 提交时间: 2022-06-25

/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 
 * @param nums int整型一维数组 
 * @param numsLen int nums数组长度
 * @return int整型
 *
 * C语言声明定义全局变量请加上static,防止重复定义
 */
int max(int a, int b) {
    return a > b ? a : b;
}

int findMaxLength(int* nums, int numsLen ) {
    int preSum[numsLen + 1];
    int lastIndexArray[200001] = { 0 };
    int maxLen = 0;
    preSum[0] = 0;
    for (int i = 0; i < numsLen; i++) {
        if (nums[i] == 0) {
            nums[i] = -1;
        }
        preSum[i+1] = preSum[i] + nums[i];
        
        lastIndexArray[preSum[i+1]+100000] = i+1;
    }
    for (int i = 0; i < numsLen; i++) {
        if (preSum[i+1] == 0) {
            maxLen = max(maxLen, i+1);
        }
        
        if (lastIndexArray[preSum[i+1]+100000] > i) {
            maxLen = max(maxLen, lastIndexArray[preSum[i+1]+100000] - i - 1);
        }
    }
    
    return maxLen;
}




C++ 解法, 执行用时: 21ms, 内存消耗: 5124KB, 提交时间: 2022-08-06

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param nums int整型vector 
     * @return int整型
     */
    int findMaxLength(vector<int>& nums) {
        // write code here
        int len=nums.size();
        for(int i=0;i<len;i++)
        {
            if(nums[i]==0)
                nums[i]=-1;
        }
        unordered_map<int,int> hash;
        int prev=0;
        hash[0]=-1;
        int ans=0;
        for(int i=0;i<len;i++)
        {
            prev+=nums[i];
            if(hash.find(prev)!=hash.end())
            {
                ans=max(ans,i-hash[prev]);
            }
            if(hash.find(prev)==hash.end())
                hash[prev]=i;
        }
        return ans;
    }
};

C++ 解法, 执行用时: 21ms, 内存消耗: 5128KB, 提交时间: 2022-03-14

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param nums int整型vector 
     * @return int整型
     */
    int findMaxLength(vector<int>& nums) {
        // write code here
        int len=nums.size();
        for(int i=0;i<len;i++){
            if(nums[i]==0)
                nums[i]=-1;
        }
        unordered_map<int, int> hash;
        int prev=0;
        hash[0]=-1;
        int ans=0;
        for(int i=0;i<len;i++){
            
            prev+=nums[i];
            if(hash.find(prev)!=hash.end()){
                ans=max(ans,i-hash[prev]);
            }
            if(hash.find(prev)==hash.end())
                hash[prev]=i;
            
        }
        return ans;
        
    }
};

C++ 解法, 执行用时: 21ms, 内存消耗: 5140KB, 提交时间: 2022-06-21

class Solution {
  public:
    int findMaxLength(vector<int>& nums) {
        int h = nums.size();

        for (int i = 0; i < h; i++) {
            if (nums[i] == 0)
                nums[i] = -1;
        }

        unordered_map<int, int> a;
        int f = 0;
        a[0] = -1;
        int z = 0;

        for (int i = 0; i < h; i++) {
            f += nums[i];
            if (a.find(f) != a.end()) {
                z = max(z, i - a[f]);
            }
            if (a.find(f) == a.end())
                a[f] = i;
        }
        return z;
    }
};

C++ 解法, 执行用时: 21ms, 内存消耗: 5496KB, 提交时间: 2022-05-11

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param nums int整型vector 
     * @return int整型
     */
    int findMaxLength(vector<int>& nums) {
        // write code here
        int len=nums.size();
        vector<int>    temp(len,0);
        unordered_map<int, int> mp;
        temp[0]=(nums[0]==0?1:-1);
        for(int i=1;i<len;i++)
        {
            if(nums[i]==1)
                temp[i]=temp[i-1]-1;
            else
                temp[i]=temp[i-1]+1;
        }
        int res=0;
        for(int i=0;i<len;i++)
        {
            if(temp[i]==0)
                res=max(res,i+1);
            else
            {
                if(mp.find(temp[i])==mp.end())
                    mp[temp[i]]=i;
                else
                    res=max(res,i-mp[temp[i]]);
            }
        
        }
        return res;
    }
};



















上一题