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

69 阅读3分钟

问题描述

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

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

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


测试样例

样例1:

输入:n = 3 ,k = 1
输出:6

样例2:

输入:n = 2 ,k = 2
输出:6

样例3:

输入:n = 4 ,k = 3
输出:30

问题分析

  1. 数组元素两两不同:这意味着我们需要生成一个包含 n 个不同元素的数组。
  2. 数组所有元素的最大公约数为 k:这意味着数组中的每个元素都必须是 k 的倍数。
  3. 数组元素之和尽可能小:为了使数组元素之和最小,我们应该选择尽可能小的 k 的倍数。

解题思路

  1. 生成数组:我们可以从 k 开始,每次增加 k,直到生成 n 个不同的元素。
  2. 计算和:将这些元素相加,得到数组元素之和。

代码提示

public class Main {
    public static int solution(int n, int k) {
        // 初始化数组和
        int sum = 0;
        // 初始化当前元素
        int current = k;
        
        // 循环生成n个不同的元素
        for (int i = 0; i < n; i++) {
            // 将当前元素加入和
            sum += current;
            // 生成下一个元素
            current += k;
        }
        
        // 返回数组元素之和
        return 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. 初始化:我们初始化 sum 为 0,currentk
  2. 循环生成元素:在每次循环中,我们将 current 加入 sum,然后将 current 增加 k,以确保下一个元素也是 k 的倍数。
  3. 返回结果:最后返回 sum,即数组元素之和。

时间复杂度

此代码的主要操作是一个简单的 for 循环,循环次数为 n。在每次循环中,我们执行的操作是常数时间复杂度的操作(加法和赋值)。因此,时间复杂度可以表示为:[ O(n) ]

空间复杂度

此代码的空间复杂度主要取决于我们使用的额外空间。我们只使用了几个变量(sumcurrent),这些变量的数量是固定的,与输入规模 n 无关。因此,空间复杂度可以表示为:[ O(1) ]

总结

  • 时间复杂度:( O(n) )
  • 空间复杂度:( O(1) )
  1. 问题理解

    • 题目要求构造一个满足特定条件的数组,并计算其元素之和的最小值。理解题目中的条件(两两不同、最大公约数为 k、元素之和最小)是解题的关键。
  2. 解题策略

    • 通过从 k 开始,每次增加 k 的方式生成数组元素,可以确保每个元素都是 k 的倍数,并且两两不同。这种策略简单且有效。代码实现简洁明了,通过一个 for 循环生成数组元素并计算和。代码的可读性和可维护性较高。
  3. 复杂度分析

    • 时间复杂度为 ( O(n) ),空间复杂度为 ( O(1) ),表明代码在时间和空间上都非常高效。