已解答
中等
相关标签
相关企业
给定一个二进制数组 nums
, 找到含有相同数量的 0
和 1
的最长连续子数组,并返回该子数组的长度。
示例 1:
输入: nums = [0,1] 输出: 2 说明: [0, 1] 是具有相同数量 0 和 1 的最长连续子数组。
示例 2:
输入: nums = [0,1,0] 输出: 2 说明: [0, 1] (或 [1, 0]) 是具有相同数量 0 和 1 的最长连续子数组。
提示:
1 <= nums.length <= 105
nums[i]
不是0
就是 1
python
# 动态规划
class Solution(object):
def findMaxLength(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
ans = 0 # 记录最大含有相同数量的 0 和 1 的最长连续子数组长度
sums = 0 # 记录nums前缀和
sets = {0: -1} # 记录sums各种前缀和第一次出现时的下标
# 循环遍历数组
for i in range(len(nums)):
# 如果nums[i]为1,sums加一
if nums[i]:
sums += 1
# 如果nums[i]为0,sums减一
else:
sums -= 1
# 如果该种前缀和未出现过加入字典集合
if sums not in sets:
sets[sums] = i
# 如果该种前缀和已经出现过就与第一次出现的前缀和下标做差即为数组长度
else:
# 更新最长数组长度
if ans < i - sets[sums]:
ans = i - sets[sums]
# 返回结果
return ans
python
遍历(超时)
class Solution(object):
def findMaxLength(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
sums = 0
lens = len(nums)
flag = False
for i in range(lens - 1, -1, -1):
if i%2!=0:
for j in range(0, lens - i):
if sum(nums[j:j + i+1]) == (i + 1) / 2:
sums = i+1
flag = True
break
if flag:
break
return sums