3934.最短唯一子数组
难度:困难
问题描述:
给你一个整数数组nums。
找出nums中与其他任何子数组均不相同的子数组的最小长度。返回一个整数,表示此类子数组的最小可能长度。
子数组是数组中的一个连续的非空元素序列。
如果两个子数组具有相同的长度,并且对应位置的元素也相同,则认为这两个子数组是相同的。
示例1:
输入:nums=3,3,3
输出:3
解释:
长度为1的子数组:3→出现3次
长度为2的子数组:3,3→出现2次
长度为3的子数组:3,3,3→出现1次
子数组3,3,3是唯一的,因此最小唯一子数组的长度为3。
示例2:
输入:nums=2,1,2,3,3
输出:1
解释:
长度为1的子数组:
2→出现2次
1→出现1次
3→出现2次
子数组1是唯一的,因此最小唯一子数组的长度为1。
示例3:
输入:nums=1,1,2,2,1
输出:2
解释:
长度为1的子数组:
1→出现3次
2→出现2次
长度为2的子数组:
1,1→出现1次
1,2→出现1次
2,2→出现1次
2,1→出现1次
至少有一个长度为2的子数组是唯一的,因此最小唯一子数组的长度为2。
提示:
1<=nums.length<=10**5
1<=numsi<=10**5
问题分析:
本问题首先要解决如何在一个整数数组nums中找出所有子数组的问题,函数get_all_sub_array(nums)实现了这一功能,其次是在这些子数组中找出只出现一次的子数组,这样就保证了这些找出的子数组具有唯一性,最后在这些具有唯一性的子数组中找出最短长度即为问题的解。
程序如下:
python
#找出一个数组nums中所有的子数组并返回
def get_all_sub_array(nums):
n=len(nums)
a=[]
for i in range(n):
for j in range(i+1,n+1):
b=nums[i:j]
a.append(b)
return a
#主程序
nums=eval(input('pls input nums='))
t=get_all_sub_array(nums)
b=[]
for i in t:
if t.count(i)==1:
b.append(i)
c=min(list(len(x) for x in b))
print(c)
运行实例一
pls input nums=1,2,3,3,4
1
运行实例二
pls input nums=1,2,1,2,2,3
1
运行实例三
pls input nums=2,3,2,3,2
3