首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【LeetCode每日一题】525. 连续数组

【LeetCode每日一题】525. 连续数组

作者头像
公众号guangcity
发布2021-07-09 15:50:15
发布2021-07-09 15:50:15
47900
代码可运行
举报
文章被收录于专栏:光城(guangcity)光城(guangcity)
运行总次数:0
代码可运行

【LeetCode每日一题】525. 连续数组

题目:

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

示例 1:

代码语言:javascript
代码运行次数:0
运行
复制
输入: nums = [0,1]
输出: 2
说明: [0, 1] 是具有相同数量0和1的最长连续子数组。

示例 2:

代码语言:javascript
代码运行次数:0
运行
复制
输入: nums = [0,1,0]
输出: 2
说明: [0, 1] (或 [1, 0]) 是具有相同数量0和1的最长连续子数组。

提示:

代码语言:javascript
代码运行次数:0
运行
复制
1 <= nums.length <= 105
nums[i] 不是 0 就是 1

题解:

将所有0变为-1,最长连续子数组问题就转换为sum=0时,取最长结果。使用map记录之前的前缀和,当该前缀和之前出现过,说明之前的前缀和与当前前缀和中间部分为0,比较即可。

前缀和+哈希表

代码语言:javascript
代码运行次数:0
运行
复制
class Solution {
public:
    int findMaxLength(vector<int>& nums) {
        for (auto& num : nums) {
            num = num == 0 ? -1 : num;
        }
        map<int, int> m;
        int sum = 0, ans = 0;
        for (int i = 0; i < nums.size(); i++) {
            sum += nums[i];
            if (sum == 0) {
                ans = i + 1;
            }
            if (m.count(sum)) {
                ans = max(i - m[sum], ans);
            } else {
                m[sum] = i;
            }
        }
        return ans;
    }
};

或者直接处理:

代码语言:javascript
代码运行次数:0
运行
复制
class Solution {
public:
    int findMaxLength(vector<int>& nums) {
        map<int, int> m;
        int sum = 0, ans = 0;
        m[0] = -1;
        for (int i = 0; i < nums.size(); i++) {
            sum += nums[i] ? 1 : -1;
            if (m.count(sum)) {
                ans = max(ans, i - m[sum]);
            } else {
                m[sum] = i;
            }
        }
        
        return ans;
    }
};

本节已完

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-06-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 光城 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 【LeetCode每日一题】525. 连续数组
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档