数组元素之和最小化 | 豆包MarsCode AI刷题
简单题,只需要从1*k开始贪心就好了
摘要
给定整数 和 ,需要构造一个长度为 的数组,使得:
- 数组元素两两不同。
- 数组所有元素的最大公约数为 。
- 数组元素之和最小。
我们需要输出该数组元素之和的最小值。
问题描述
任务:构造一个满足条件的数组,并返回其最小和。
条件:
- 数组中所有元素两两不同。
- 数组所有元素的最大公约数为 。
- 数组元素之和尽可能小。
测试样例
示例 1
输入:
n = 3, k = 1
输出:
6
示例 2
输入:
n = 2, k = 2
输出:
6
示例 3
输入:
n = 4, k = 3
输出:
30
算法原理
核心思路
-
最大公约数的约束:
- 数组元素的最大公约数是 ,这意味着数组中的每个元素必须是 的倍数。
- 因此,数组可以表示为: 其中, 是两两不同的正整数。
-
最小化数组之和:
- 为了让数组之和最小,我们选择最小的 个正整数:
- 数组构造为:
-
计算总和:
- 数组的总和为:
- 根据等差数列求和公式:
- 代入计算:
时间复杂度
- 数组构造复杂度:。
- 数组求和复杂度:。
总时间复杂度:。
空间复杂度
只需要常量级空间。
总空间复杂度:。
Go 实现
package main
import "fmt"
// solution 计算数组元素之和的最小值
func solution(n int, k int) int {
// 根据公式计算数组的最小和
return k * n * (n + 1) / 2
}
func main() {
fmt.Println(solution(3, 1) == 6) // 应输出 true
fmt.Println(solution(2, 2) == 6) // 应输出 true
fmt.Println(solution(4, 3) == 30) // 应输出 true
}
Python 实现
def solution(n: int, k: int) -> int:
"""
计算数组元素之和的最小值。
"""
# 根据公式计算数组的最小和
return k * n * (n + 1) // 2
if __name__ == "__main__":
# 测试用例
print(solution(3, 1) == 6) # 应输出 True
print(solution(2, 2) == 6) # 应输出 True
print(solution(4, 3) == 30) # 应输出 True
输出解释
示例 1:
输入:
n = 3, k = 1
数组构造为 [1, 2, 3]
。总和:
示例 2:
输入:
n = 2, k = 2
数组构造为 [2, 4]
。总和:
示例 3:
输入:
n = 4, k = 3
数组构造为 [3, 6, 9, 12]
。总和: