伴学笔记 | 豆包MarsCode AI刷题

35 阅读2分钟

数组元素之和最小化

问题描述:

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

1.数组中的所有元素两两不同。

2.数组所有元素的最大公约数为k.

3.数组元素之和尽可能小。

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

 

解题思路:

首先要理解 最大公约数(GCD)和数组的构造要求。数组中的所有元素必须是 k 的倍数,并且它们的最大公约数必须是 k。这意味着:

1.每个元素必须是 k 的倍数,因此我们可以将数组的每个元素表示为 k * x,其中 x 是正整数。

2.由于要求最大公约数为 k,这些 x 必须是互质的(即它们的最大公约数为 1)。所以,我们可以选择从 1 开始的前 n 个互质的整数。

 

解决步骤:

.我们首先需要选择 n 个互质的整数。最简单的方法是选择从 1 到 n 的整数,因为这些整数是互质的,然后.将这些整数乘以 k,得到最终的数组元素,最后求出数组元素的和。

 

关键点:

1.要求的是尽可能小的和,所以我们选择最小的 n 个互质的整数。

2.每个元素是 k 的倍数,最终的数组和是 k * (1 + 2 + 3 + ... + n)。

 

数学推导:

1.从 1 到 n 的和是 n * (n + 1) / 2。

2.所以,数组的元素和为 k * (1 + 2 + 3 + ... + n),即 k * (n * (n + 1) / 2)。

 

代码实现:

def solution(n: int, k: int) -> int:

    # 计算从1到n的和

    sum_of_first_n = n * (n + 1) // 2

    # 结果是 k 乘以这个和

    return k * sum_of_first_n

 

测试用例

if name == 'main':

    print(solution(n = 3, k = 1) == 6)  # 输出: 6

    print(solution(n = 2, k = 2) == 6)  # 输出: 6

    print(solution(n = 4, k = 3) == 30)  # 输出: 30

 

解释:

1.sum_of_first_n = n * (n + 1) // 2 计算了从 1 到 n 的整数和。

2.最终的数组元素和是 k * sum_of_first_n,即 k * (n * (n + 1) / 2)。

 

时间复杂度:

计算从 1 到 n 的和的时间复杂度是 O(1),所以整个算法的时间复杂度是常数时间 O(1)。

 

测试样例:

1.输入:n = 3, k = 1

从 1 到 3 的和是 1 + 2 + 3 = 6,所以答案是 1 * 6 = 6。

输出:6

 

2.输入:n = 2, k = 2

从 1 到 2 的和是 1 + 2 = 3,所以答案是 2 * 3 = 6。

输出:6

 

3.输入:n = 4, k = 3

从 1 到 4 的和是 1 + 2 + 3 + 4 = 10,所以答案是 3 * 10 = 30。

输出:30

 

总结:

这道题通过简单的数学公式和选择互质数的思路,能够高效地计算出数组元素之和的最小值。