📅  最后修改于: 2023-12-03 15:42:11.722000             🧑  作者: Mango
给定一个数组 A
,找到最长的连续子数组,使得该子数组同时满足以下条件:
3
如果存在多个满足条件的子数组,输出其中任意一个即可。如果不存在满足条件的子数组,返回空数组。
def longest_continuous_subarray(A: List[int]) -> List[int]:
pass
函数输入仅包含一个参数 A
,其类型为整数列表。1 ≤ |A| ≤ $10^5$,0 ≤ A[i] ≤ 10000。
函数应该返回一个整数列表表示最长连续的子数组。
输入:
A = [1, 2, 3, 4]
输出:
[]
输入:
A = [2, 4, 6, 8]
输出:
[2, 4, 6, 8]
输入:
A = [1, 3, 5, 7]
输出:
[1, 3, 5, 7]
输入:
A = [1, 2, 4, 6, 8, 3, 5, 7]
输出:
[2, 4, 6, 8]
这道题目需要我们找到一个最长连续的奇数或偶数数组,又因为奇数或偶数构成的数组可以拆分成两个奇数或偶数数组,所以我们可以对原数组进行处理,找到其中所有的奇数或偶数数组,再从中选出长度最长的一个即可。
res
,用于记录找到的最长奇数或偶数数组A
的长度 n
A
进行遍历,如果当前元素 A[i]
与前一个元素 A[i-1]
的奇偶性不相同,则当前的奇数或偶数子数组已经结束,我们计算该子数组的长度,并把它放入一个临时数组 temp
中,如果 temp
的长度大于 res
的长度,则用 temp
更新 res
res
长度大于等于 3,则返回 res
,否则返回空数组本算法遍历了数组 A
一次,时间复杂度为 $O(n)$,空间复杂度也为 $O(n)$,其中 $n$ 表示 A
的长度。
from typing import List
def longest_continuous_subarray(A: List[int]) -> List[int]:
n = len(A)
res = []
temp = []
for i in range(n):
if not temp or (temp[-1] % 2 == A[i] % 2):
temp.append(A[i])
else:
if len(temp) >= 3 and len(temp) > len(res):
res = temp[:]
temp = [A[i]]
if len(temp) >= 3 and len(temp) > len(res):
res = temp
return res