📅  最后修改于: 2023-12-03 14:58:06.603000             🧑  作者: Mango
给定一个整数数组 nums,你需要找到一个最小的连续子序列,使得对于此连续子序列中的每个元素 nums[i],都有 0 <= nums[i] <= 9,并且这个连续子序列是由相等的数字组成的。换句话说,这个连续子序列就是由一个数字重复若干次组成的。
你需要通过将这个连续子序列中的数字替换为 0,使得整个数组 nums 所有元素的和为 0。
输出这个最小连续子序列的长度。如果不存在这样的连续子序列,则返回 -1。
输入:[1,2,3,2,1]
输出:5
解释:整个数组所有元素之和为 9,而通过将重复字串 [2,3,2] 替换为 [0,0,0],得到的新数组 [1,0,0,0,1] 的所有元素之和为 0,所以所需的最小连续子序列长度为 5。
输入:[1,2,3,2,1,2,3,2,1]
输出:-1
解释:无法通过替换任何子数组使得整个数组的和等于0。
首先可以求出这个数组所有元素的和 sum,然后遍历数组,将 nums[i] 累加到一个变量 total 中,同时将 num[i] 存入一个队列 queue 中。
如果 total - sum % 10 == 0,则说明 queue 队列中最后一个元素可以替换成 0。因为 total 减去最后一个元素后能够整除 10,表示这个连续子序列中的所有数字加起来恰好能够整除 10,将最后一个元素减去将符合条件。
接下来需要判断是否满足所有的 nums[i] 都在 0 和 9 之间,如果不是就返回 -1,否则继续进行计算。由于我们已经找到了一个连续子序列,所以我们可以将这部分数据替换成 0 继续进行计算,直到总和为 0。
def minSubArray(nums):
total_sum = sum(nums)
if total_sum % 10 != 0:
return -1
queue = []
for i in range(len(nums)):
queue.append(nums[i])
if sum(queue) - total_sum % 10 == 0:
if max(queue) == 0:
break
queue.remove(max(queue))
total_sum -= total_sum % 10
if any(num < 0 or num > 9 for num in queue):
return -1
return len(queue)