力扣每日一题:525.连续数组 前缀和+hash表速解!

简介: 力扣每日一题:525.连续数组 前缀和+hash表速解!

525.连续数组


https://leetcode-cn.com/problems/contiguous-array/solution/525lian-xu-shu-zu-qian-zhui-he-hashbiao-riqe2/

难度:中等


题目:

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

并返回该子数组的长度。


示例:

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


分析

首先想吐槽的是,这用例给的也太敷衍了,开始还以为是需要0、1交替出现呢...

结果遇到一个 [0,0,1,0,0,0,1,1] 的用例猜知道指考虑连续,无需交替。

那么这道题就和题目

523.连续的子数组和

如出一辙了。

同样的我们采用前缀的方式来快速解题,这里要注意0、1的判断在这里需要修改下,如果为0,这设置为-1,

如果为1则认为是它本身,这样当出现相同的0、1数目时,这段数据的总和为0。

配合创建Hash表, 记录{总和 : 下标}, 由于可能存在nums前N数字和刚好满足条件的情况,

我们预制字典{0,-1}来规避该问题。

循环判断是否在字典中存在前缀和一样的键,并不断判断最长符合题意的连续数组,最终返回即可。

网络异常,图片无法展示
|


解题:

class Solution:
    def findMaxLength(self, nums):
        d = {0: -1}
        ret = 0
        pre = 0
        for index, num in enumerate(nums):
            if num == 0:
                pre -= 1
            else:
                pre += 1
            point = d.get(pre, index)
            if point == index:
                d[pre] = index
            else:
                ret = max(ret, index - point)
        return ret





相关文章
|
1月前
|
算法
【数组相关面试题】LeetCode试题
【数组相关面试题】LeetCode试题
|
1月前
|
存储
力扣面试经典题之数组/字符串
力扣面试经典题之数组/字符串
21 0
|
4天前
|
C++
【力扣】2562. 找出数组的串联值
【力扣】2562. 找出数组的串联值
|
1月前
|
存储 算法
《LeetCode 热题 HOT 100》——寻找两个正序数组的中位数
《LeetCode 热题 HOT 100》——寻找两个正序数组的中位数
|
1月前
|
存储
力扣刷题-最大子数组和
力扣刷题-最大子数组和
10 1
|
1月前
leetcode2967. 使数组成为等数数组的最小代价
leetcode2967. 使数组成为等数数组的最小代价
20 0
|
1月前
|
算法 搜索推荐
LeetCode刷题---215. 数组中的第K个最大元素(双指针,快速选择)
LeetCode刷题---215. 数组中的第K个最大元素(双指针,快速选择)
|
1月前
|
Go C++
【力扣】2645. 构造有效字符串的最小插入数(动态规划 贪心 滚动数组优化 C++ Go)
【2月更文挑战第17天】2645. 构造有效字符串的最小插入数(动态规划 贪心 滚动数组优化 C++ Go)
30 8
|
1月前
|
算法 测试技术 索引
力扣面试经典题之数组/字符串(二)
力扣面试经典题之数组/字符串(二)
13 0
|
1月前
|
存储 算法 语音技术
【数据结构与算法】力扣刷题记之 稀疏数组
【数据结构与算法】力扣刷题记之 稀疏数组