📌  相关文章
📜  从不能被K整除的索引中找到具有最大数字乘积的数组元素(1)

📅  最后修改于: 2023-12-03 15:36:15.867000             🧑  作者: Mango

从不能被 K 整除的索引中找到具有最大数字乘积的数组元素

问题描述

给定一个长度为 n 的正整数数组 nums,其中所有元素都小于等于 100,同时给定一个正整数 K。请你从 nums 中选出若干个元素,使得这些元素在原数组中的下标均满足不能被 K 整除,并且这些元素的乘积最大。输出这个最大乘积。

解题思路

由于题目要求不能选择下标能被 K 整除的元素,我们可以将数组 nums 拆分成 K 个数组,分别选择这 K 个数组的元素乘积的最大值。这样做的原因是,如果某个下标 i 能被 K 整除,那么这个下标和其他所有能被 K 整除的下标都不能同时被选中,因为它们除以 K 后的余数相同,相当于选择了同一个数组中的元素,不能满足“选若干个元素”的条件。

我们不妨先举个例子。假设 n=6,K=3,nums=[1,2,3,4,5,6]。那么我们将数组按下标对 3 取模的余数分为以下 3 个小数组:

  1. 下标对 3 取模余数为 0 的元素:[1, 4]
  2. 下标对 3 取模余数为 1 的元素:[2, 5]
  3. 下标对 3 取模余数为 2 的元素:[3, 6]

接着我们分别计算这三个小数组中元素的乘积的最大值:

  1. [1, 4] 的最大乘积为 4。
  2. [2, 5] 的最大乘积为 10。
  3. [3, 6] 的最大乘积为 18。

最后,我们将这三个小数组中的最大乘积相乘,即 4 * 10 * 18 = 720,即为答案。

代码实现
def max_product(nums, k):
    """
    :type nums: List[int]
    :type k: int
    :rtype: int
    """
    n = len(nums)
    max_prods = [0] * k

    for i in range(k):
        max_prod = 0
        for j in range(i, n, k):
            max_prod = max(max_prod, nums[j])

        max_prods[i] = max_prod

    return reduce(lambda x, y: x * y, max_prods)
复杂度分析
  • 时间复杂度:$O(n)$,其中 $n$ 是数组 nums 的长度。遍历数组 nums 的时间复杂度是 $O(n)$,每个元素只会被遍历一遍。
  • 空间复杂度:$O(k)$,存储每个小数组中的最大值需要 $k$ 个空间。