【Leetcode Daily】525连续数组
发表于|更新于|力扣日常 | LeetcodeDaily
|总字数:446|阅读时长:1分钟|浏览量:
题目浅析
想查看原题可以点击题目链接。
简单地说,就是给一个由 0 和 1 组成的数组,求其中 0 与 1 数量相同的长度最长的子数组的长度。
思路分享
前缀和的思路,可以参考 【Leetcode Daily】303区域和检索-数组不可变
如何衡量子数组中的 0 和 1 数量相同呢?有一种方便的方法,就是把 0 视作 -1,这样子数组的和为 0 的话就算是满足条件的子数组了。(发现变着花样地凑子数组和为零算是这种类型题的常见套路了)
那么接下来,只要用哈希表记录前缀和对应的最左下标,一旦发现之前记录过相同数值的前缀和,就可以记录现在下标与记录下标之差作为结果参照之一。
注意,这种一般都要设置一个初始值,比如本题下面的参考解法就是给数值零设置初始值 -1,原因是哈希表的意义是每个前缀和数值对应的最左下标的前一位,所以对于从第一位就可能是子数组的情况而言,需要往前算一位。比如 [0, 1],遍历到 1,此时下标为 1,也算满足条件的子数组,此时如果哈希表中对应 0 的数值为 0,计算出来的长度就是 1 的错误答案。
代码解答(强烈建议自行解答后再看)
- 参考题解
1 | class Solution: |
文章作者: 陆爻齐-LuYaoQi
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 LuYaoQi's Blogs!
相关推荐

2025-07-09
【Leetcode Daily】1524和为奇数的子数组数目
题目浅析 想查看原题可以点击题目链接。 简单地说,就是给一个整数数组,要求这个数组中所有子数组中和为奇数的数目。 思路分享 前缀和的思路,可以参考 【Leetcode Daily】303区域和检索-数组不可变 虽然是陆爻齐自己思考了出来,但如果没有提前知道是前缀和区域,应该是做不出来的。 回忆解题的过程,就是思考如何快速判定奇数区域时,对做了前缀和了数组观察偶然发现,只要记录此前的奇数和偶数的数目,就能方便地计算现有的数字与此前数字之前区域的和为奇数的数目。 代码解答(强烈建议自行解答后再看) 参考题解 123456789101112131415class Solution: def numOfSubarrays(self, arr: List[int]) -> int: s = list(accumulate(arr, initial=0)) even_num = 0 odd_num = 0 ans = 0 for i in s: if i%2 == 0: ...

2025-07-10
【Leetcode Daily】974和可被K整除的子数组
题目浅析 想查看原题可以点击题目链接。 简单地说,就是给一个整数数组和一个整数 k,要求其中所有子数组和能被 k 整除的数量。 思路分享 前缀和的思路,可以参考 【Leetcode Daily】303区域和检索-数组不可变 和之前的有些不同,发现有关取模的题目,大多都是判断取模后的内容来判断。前缀和是从下标零开始的一段子数组和,那么如果其中有一段子数组可以被 k 整除,可以写成 (i - j) % k == 0,换句话就是 i % k == j % k,题目也就转换成了找前缀和中,有多少组取模后的值相同的经典枚举情况。 https://leetcode.cn/problems/subarray-sums-divisible-by-k/solutions/22267/he-ke-bei-kzheng-chu-de-zi-shu-zu-by-lenn123/ 代码解答(强烈建议自行解答后再看) 参考题解 12345678910class Solution: def subarraysDivByK(self, nums:...

2025-07-11
【Leetcode Daily】523连续的子数组和
题目浅析 想查看原题可以点击题目链接。 简单地说,就是给一个整数数组和整数 K,求其中是否存在长度至少为二且数值和为 K 的倍数的子数组。 思路分享 前缀和的思路,可以参考 【Leetcode Daily】303区域和检索-数组不可变 这道题和 【Leetcode Daily】974和可被K整除的子数组 相近,或者说这种什么整除,取模啥的,得列下式子,然后发现找子数组总和其实就是前缀和的两侧对 K 取模值相同即可,因为这样子两个值相减所得中间数组和就正好能被 K 整除,也就是 K 的倍数了。 https://leetcode.cn/problems/continuous-subarray-sum/solutions/3714798/ling-shen-ti-dan-qian-zhui-he-ha-xi-biao-oif8/ 代码解答(强烈建议自行解答后再看) 参考题解 1234567891011121314151617class Solution: def checkSubarraySum(self, nums: List[int], k: int)...

2025-07-13
【Leetcode Daily】437路径总和III
题目浅析 想查看原题可以点击题目链接。 简单地说,给了一个二叉树,求其中子链的数值和为 targetSum 的数目。子链的定义是二叉树中任意父节点到其子节点的节点链。 思路分享 前缀和的思路,可以参考 【Leetcode Daily】303区域和检索-数组不可变 这个题挺有意思的,通过这道题能够积累到有这么一种思路:可以通过类似二叉树的前序遍历,同时用哈希表记录前缀和。遍历的本质就是枚举子链的重点,这样就能清晰地看到每个有目标和值的子链。 代码解答(强烈建议自行解答后再看) 参考题解 12345678910111213141516171819202122232425262728# Definition for a binary tree node.# class TreeNode:# def __init__(self, val=0, left=None, right=None):# self.val = val# self.left = left# self.right = rightclass...

2025-07-14
【Leetcode Daily】2588统计美丽子数组数目
题目浅析 想查看原题可以点击题目链接。 简单地说,就是可以按照一个规则不断削减数组内的值,问其中有多少个子数组经过这个规则可以削减到全零的情况。 思路分享 前缀和的思路,可以参考 【Leetcode Daily】303区域和检索-数组不可变 这道题由于规则中,涉及到了 2^k,把数字转换成二进制,就会发现,如果满足条件,其实就发现这个子数组的二进制数处理后就变成了 0。本质上就把题目转化为了,找出所有子数组和为零的情况。 https://leetcode.cn/problems/count-the-number-of-beautiful-subarrays/solutions/2163133/tao-lu-qian-zhui-he-ha-xi-biao-pythonjav-3fna 代码解答(强烈建议自行解答后再看) 参考题解 12345678910class Solution: def beautifulSubarrays(self, nums: List[int]) -> int: ans = s = 0 cnt =...

2025-07-17
【Leetcode Daily】17-05字母与数字
题目浅析 想查看原题可以点击目链接。 简单地说,就是给一个数组,由字母和数字组成,找出其中字母和数字数目相同的子数组中,长度最长的那个。 思路分享 前缀和的思路,可以参考 【Leetcode Daily】303区域和检索-数组不可变 出了题目描述,和昨天题目一模一样。【Leetcode Daily】525连续数组,要学会把两个数量相等,视作两个数量相加为 0 的思路。 代码解答(强烈建议自行解答后再看) 参考题解 123456789101112131415161718192021class Solution: def findLongestSubarray(self, array: List[str]) -> List[str]: acc_sum = 0 rec = defaultdict(int) max_len = 0 max_index = 0 rec[0] = -1 for i, x in enumerate(array): acc_sum...
公告
不定时更新,记录所学所想
系列文章