📅  最后修改于: 2023-12-03 15:36:15.867000             🧑  作者: Mango
给定一个长度为 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 个小数组:
接着我们分别计算这三个小数组中元素的乘积的最大值:
最后,我们将这三个小数组中的最大乘积相乘,即 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)