问题描述
小C希望构造一个包含n个元素的数组,且满足以下条件:
- 数组中的所有元素两两不同。
- 数组所有元素的最大公约数为
k。 - 数组元素之和尽可能小。
任务是输出该数组元素之和的最小值。
测试样例
样例1:
输入:
n = 3 ,k = 1
输出:6
样例2:
输入:
n = 2 ,k = 2
输出:6
样例3:
输入:
n = 4 ,k = 3
输出:30
问题分析
- 数组元素两两不同:这意味着我们需要生成一个包含
n个不同元素的数组。 - 数组所有元素的最大公约数为
k:这意味着数组中的每个元素都必须是k的倍数。 - 数组元素之和尽可能小:为了使数组元素之和最小,我们应该选择尽可能小的
k的倍数。
解题思路
- 生成数组:我们可以从
k开始,每次增加k,直到生成n个不同的元素。 - 计算和:将这些元素相加,得到数组元素之和。
代码提示
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);
}
}
关键步骤解释
- 初始化:我们初始化
sum为 0,current为k。 - 循环生成元素:在每次循环中,我们将
current加入sum,然后将current增加k,以确保下一个元素也是k的倍数。 - 返回结果:最后返回
sum,即数组元素之和。
时间复杂度
此代码的主要操作是一个简单的 for 循环,循环次数为 n。在每次循环中,我们执行的操作是常数时间复杂度的操作(加法和赋值)。因此,时间复杂度可以表示为:[ O(n) ]
空间复杂度
此代码的空间复杂度主要取决于我们使用的额外空间。我们只使用了几个变量(sum 和 current),这些变量的数量是固定的,与输入规模 n 无关。因此,空间复杂度可以表示为:[ O(1) ]
总结
- 时间复杂度:( O(n) )
- 空间复杂度:( O(1) )
-
问题理解:
- 题目要求构造一个满足特定条件的数组,并计算其元素之和的最小值。理解题目中的条件(两两不同、最大公约数为
k、元素之和最小)是解题的关键。
- 题目要求构造一个满足特定条件的数组,并计算其元素之和的最小值。理解题目中的条件(两两不同、最大公约数为
-
解题策略:
- 通过从
k开始,每次增加k的方式生成数组元素,可以确保每个元素都是k的倍数,并且两两不同。这种策略简单且有效。代码实现简洁明了,通过一个for循环生成数组元素并计算和。代码的可读性和可维护性较高。
- 通过从
-
复杂度分析:
- 时间复杂度为 ( O(n) ),空间复杂度为 ( O(1) ),表明代码在时间和空间上都非常高效。