📌  相关文章
📜  通过替换由相等元素组成的最小子序列,使所有数组元素等于 0(1)

📅  最后修改于: 2023-12-03 14:58:06.603000             🧑  作者: Mango

通过替换由相等元素组成的最小子序列,使所有数组元素等于 0

问题描述

给定一个整数数组 nums,你需要找到一个最小的连续子序列,使得对于此连续子序列中的每个元素 nums[i],都有 0 <= nums[i] <= 9,并且这个连续子序列是由相等的数字组成的。换句话说,这个连续子序列就是由一个数字重复若干次组成的。

你需要通过将这个连续子序列中的数字替换为 0,使得整个数组 nums 所有元素的和为 0。

输出这个最小连续子序列的长度。如果不存在这样的连续子序列,则返回 -1。

示例
示例 1:

输入:[1,2,3,2,1]

输出:5

解释:整个数组所有元素之和为 9,而通过将重复字串 [2,3,2] 替换为 [0,0,0],得到的新数组 [1,0,0,0,1] 的所有元素之和为 0,所以所需的最小连续子序列长度为 5。

示例 2:

输入:[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)