玩命加载中 . . .

525-连续数组


LeetCode 525. 连续数组

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

示例 1:

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

示例 2:

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

method

把0当成-1,转化为找和为0的最长连续子数组,用前缀和,也就是[i+1,j]的和为0,所以前缀和pre[j]-pre[i]=0,也就是pre[j]=pre[i],这样就可以用哈希表存储,如果某个等于pre[j]的前缀和pre[i]出现过,说明[i+1,j]的和为0

int findMaxLength(vector<int>& nums) {
    int len = 0;
    unordered_map<int, int> hash;
    hash[0] = -1;
    int cur = 0;
    for (int i = 0; i < nums.size(); i++) {
        if (nums[i] == 1) {
            cur++;
        }
        else {
            cur--;
        }
        if (hash.find(cur) != hash.end()) {
            int idx = hash[cur];
            len = max(len, i - idx);
        }
        else {
            hash[cur] = i;
        }
    }
    return len;
}

文章作者: kunpeng
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 kunpeng !
  目录