3721.最长平衡子数组II
难度:困难
问题描述:
给你一个整数数组nums。
如果子数组中不同偶数的数量等于不同奇数的数量,则称该子数组是平衡的。
返回最长平衡子数组的长度。
子数组是数组中连续且非空的一段元素序列。
示例1:
输入:nums=[2,5,4,3]
输出:4
解释:
最长平衡子数组是[2,5,4,3]。
它有2个不同的偶数[2,4]和2个不同的奇数[5,3]。因此,答案是4。
示例2:
输入:nums=[3,2,2,5,4]
输出:5
解释:
最长平衡子数组是[3,2,2,5,4]。
它有2个不同的偶数[2,4]和2个不同的奇数[3,5]。因此,答案是5。
示例3:
输入:nums=[1,2,3,2]
输出:3
解释:
最长平衡子数组是[2,3,2]。
它有1个不同的偶数[2]和1个不同的奇数[3]。因此,答案是3。
提示:
1<=nums.length<=105
1<=nums[i]<=105
问题分析:
本问题的解决采用枚举算法,分为下面几个步骤:
一是判断一个数组a是否是一个奇偶平衡数组,这是后面用枚举算法时进行检验的关键;
二是从给定的数组nums中枚举出所有不同的子数组,检验其平衡性,并找出其中长度最长的平衡子数组,返回这个子数组及其长度。
程序如下:
python
#判断一个数组a中不同奇偶数数量,如果是平衡的,返回True,否则返回False
def check_odd_or_even_array(a):
a=list(set(a))
n=len(a)
odd=0
for i in a:
if i%2==0:
odd=odd+1
return True if odd==n-odd else False
#分解数组nums中的所有子数组,判断其奇偶平衡状态,统计长度最长的平衡子数组并返回其长度
def get_max_odd_or_even_sub_array(nums):
n=len(nums)
max_len=0
max_sub=''
for i in range(n):
for j in range(i+1,n+1):
a=nums[i:j]
k=len(a)
if check_odd_or_even_array(a) and max_len<k:
max_len=k
max_sub=a
return max_len,max_sub
#主程序
nums=eval(input('pls input nums='))
max_len,max_sub=get_max_odd_or_even_sub_array(nums)
print(f'最长子数组的长度为{max_len},最长子数组为{max_sub}')
运行实例一
pls input nums=[1,2,3,2,2,4,5,3,7]
最长子数组的长度为7,最长子数组为[2, 3, 2, 2, 4, 5, 3]
运行实例二
pls input nums=[1,2,3,4,4,5,6]
最长子数组的长度为7,最长子数组为[1, 2, 3, 4, 4, 5, 6]
运行实例三
pls input nums=[1,3,4,4,4,5]
最长子数组的长度为4,最长子数组为[3, 4, 4, 4]
解决问题,要抓住关键,合理选择算法。