📜  门| GATE CS 2018 |第 62 题(1)

📅  最后修改于: 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。

输出格式

函数应该返回一个整数列表表示最长连续的子数组。

示例
示例 1

输入:

A = [1, 2, 3, 4]

输出:

[]
示例 2

输入:

A = [2, 4, 6, 8]

输出:

[2, 4, 6, 8]
示例 3

输入:

A = [1, 3, 5, 7]

输出:

[1, 3, 5, 7]
示例 4

输入:

A = [1, 2, 4, 6, 8, 3, 5, 7]

输出:

[2, 4, 6, 8]
题目解析

这道题目需要我们找到一个最长连续的奇数或偶数数组,又因为奇数或偶数构成的数组可以拆分成两个奇数或偶数数组,所以我们可以对原数组进行处理,找到其中所有的奇数或偶数数组,再从中选出长度最长的一个即可。

算法流程
  1. 创建一个空数组 res,用于记录找到的最长奇数或偶数数组
  2. 获取原数组 A 的长度 n
  3. A 进行遍历,如果当前元素 A[i] 与前一个元素 A[i-1] 的奇偶性不相同,则当前的奇数或偶数子数组已经结束,我们计算该子数组的长度,并把它放入一个临时数组 temp 中,如果 temp 的长度大于 res 的长度,则用 temp 更新 res
  4. 如果 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