青训营ai刷题:数组元素之和最小化

90 阅读3分钟

问题分析

这个问题要求我们构造一个包含 n 个元素的数组,满足以下条件:

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

我们的目标是:给定 nk,构造一个符合条件的数组,使其元素和最小,并输出该和。

思路分析

  1. 最大公约数为 k

    • 数组元素的最大公约数是 k,意味着所有元素都可以看作是 k 的倍数。因此,我们可以将所有元素表示为 k * m1, k * m2, ..., k * mn,其中 m1, m2, ..., mnn 个互不相同的正整数。
  2. 求最小和:

    • 我们需要选择最小的 n 个正整数,使得它们互不相同,并且它们的最大公约数为 1。
    • 因为数组元素是 k * mi,所以我们要求的最小和其实是:k * (m1 + m2 + ... + mn),其中 m1, m2, ..., mn 是互不相同的正整数,并且它们的最大公约数为 1。
  3. 选择最小的 n 个互不相同的整数:

    • 选取的整数应该是从 1 开始的最小整数集,保证它们的最大公约数为 1。例如,对于 n = 3,我们选择 1, 2, 3,因为它们的最大公约数为 1。
  4. 计算最小和:

    • 选择最小的 n 个正整数时,得到的和就是 1 + 2 + 3 + ... + n,也就是 n * (n + 1) / 2
    • 最终数组的和是 k * (1 + 2 + ... + n),即 k * (n * (n + 1) / 2)

代码实现 public class Main {

// 计算最小的数组元素和
public static int solution(int n, int k) {
    // 求 1 到 n 的和
    int sum = n * (n + 1) / 2;
    // 数组元素之和是 k 乘以 1 到 n 的和
    return k * sum;

} public static void main(String[] args) {

 System. out. println(solution(3, 1) == 6);
 System.out.println(solution(2,2) == 6);
 System. out. println(solution(4, 3) == 30);

} }

代码解析

  1. solution 方法:

    • 计算从 1n 的和: sum = n * (n + 1) / 2。这是求自然数和的公式。
    • 最终的数组元素之和是 k * sum,因为每个元素是 k 的倍数。
  2. main 方法:

    • 用于测试 solution 方法,输出对应的结果。

测试

测试用例1 输入:n = 3, k = 1 输出:6 解释:最小的3个互不相同的正整数是 1, 2, 3,它们的和为 1 + 2 + 3 = 6。因此,数组元素和是 1 * 6 = 6

测试用例2 输入:n = 2, k = 2 输出:6 解释:最小的2个互不相同的正整数是 1, 2,它们的和为 1 + 2 = 3。因此,数组元素和是 2 * 3 = 6

测试用例3 输入:n = 4, k = 3 输出:30 解释:最小的4个互不相同的正整数是 1, 2, 3, 4,它们的和为 1 + 2 + 3 + 4 = 10。因此,数组元素和是 3 * 10 = 30

时间复杂度分析

  • 时间复杂度:O(1),因为我们只进行了一些简单的算术计算。
  • 空间复杂度:O(1),只使用了少量的额外空间。

总结

本题的关键是将数组元素看作 k 的倍数,然后通过选择最小的 n 个互不相同的正整数来构造数组。这些整数的和是 n * (n + 1) / 2,最终的数组元素和是该和乘以 k。该问题的解决方案简单高效,能够在常数时间内计算出结果。