📅  最后修改于: 2023-12-03 15:21:38.768000             🧑  作者: Mango
给定一个整数数组,找到一个乘积等于 2 的幂的最长子数组的长度。如果不存在,则返回 0。
我们可以使用两个指针 left 和 right 来维护滑动窗口,以及一个哈希表来记录每个子数组的乘积。
我们先将 left 和 right 都初始化为 0,然后用 right 指针向右移动,每次把新的元素乘到当前子数组的乘积上,直到当前子数组的乘积大于等于 k。
此时,我们就找到了以 left 为起点的最长满足要求的子数组。接下来,我们不断移动 left 指针,每次都把当前子数组的第一个元素除掉,直到当前子数组的乘积小于 k。
然后,我们继续移动 right 指针,重复上述操作,直到 right 指针到达数组末尾。
下面是 Python 代码实现:
class Solution(object):
def findMaxLength(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
left, right = 0, 0
prod = 1
max_len = 0
num_map = {1: -1}
for right in range(len(nums)):
prod *= nums[right]
if prod in num_map:
max_len = max(max_len, right - left + num_map[prod])
if prod == 1:
num_map[prod] = right
elif prod % 2 == 0:
num_map[prod // 2] = right
return max_len
时间复杂度为 O(n),其中 n 是数组的长度。