数组元素之和最小化 | 豆包MarsCode AI刷题

41 阅读3分钟

问题描述

小C希望构造一个包含n个元素的数组,且满足以下条件:

  1. 数组中的所有元素两两不同。
  2. 数组所有元素的最大公约数为 k
  3. 数组元素之和尽可能小。

任务是输出该数组元素之和的最小值。

思考过程

根据题目要求,我们需要构造一个包含 nn 个元素的数组,具体的构造方法如下:

  • 由于要求所有数组元素的最大公约数必须为 kk,因此我们可以推断出,数组中的每一个元素都应当是 kk 的倍数。这是确保它们的最大公约数满足条件的一种有效方式。
  • 为了进一步满足题目中提出的元素和尽可能小的需求,我们可以选择从k开始的连续的k的倍数。这样做不仅简单明了,而且能有效地控制总和的大小。
  • 由此可以构建出该数组的基本形式为:k,2k,3k,…,nk。这意味着我们将依次选取k的前n个倍数。
  • 然而,为了确保数组中每个元素都是两两不同且符合要求,我们可以直接选择前n个k的倍数,这样可以较为简单和有效地实现题目的要求。
  • 已知定义了 def solution(n: int, k: int) -> int: 的函数。该函数将接受两个参数,分别为整数类型的 n 和 k,而其最终目标是返回一个整数。

代码实现

在代码的实现过程中,我们将遵循几个清晰的步骤,以确保正确性和高效性:

第一步:  初始化一个列表,用于存储计算出 kk 的倍数。这个列表能够有效地收集我们所需要的数值,代码如下所示: multiples = []Copy

第二步:  从 kk 开始,生成 nn 个 kk 的倍数。我们将使用一个变量 current 来表示当前生成的倍数,其初始值设为 kk:

current = kCopy

这里,current 变量的作用是从 kk 开始递增,每次增加 kk,以确保接下来的生成过程中的数值始终保持为 kk 的倍数。

第三步:  使用 while 循环语句以保证生成出 nn 个 kk 的倍数。在每次迭代中,都会通过 current += k 来递增 current,直至成功生成 nn 个元素。该结构的基本形式为:

while condition: # 执行的代码块Copy

这里,while condition 表示只要 condition 条件为真,就会反复执行代码块中的内容,直到满足我们生成元素的需求。

第四步:  在完成所有倍数的生成之后,我们需要对这些倍数进行求和,以计算出它们的总和。我们将使用如下代码:

result = sum(multiples)Copy

这里,sum(multiples) 函数用于计算生成的倍数列表的总和,进而将结果存储到 result 变量中,方便后续返回或进行其他处理。

def solution(n: int, k: int) -> int:
    multiples = []
    current = k
    while len(multiples) < n:
        if current not in multiples:
            multiples.append(current)
        current += k
    result = sum(multiples)
    return result

if __name__ == '__main__':
    print(solution(n = 3, k = 1) == 6)
    print(solution(n = 2, k = 2) == 6)
    print(solution(n = 4, k = 3) == 30)