14. 数组元素之和最小化
目录
刷题前请喊一遍我们的口号:
- 方法不对,刷题白费。
- 节省时间,精准刷题。
本题难度系数:⭐⭐⭐ 中
问题描述
小 C 希望构造一个包含 n 个元素的数组,且满足以下条件:
- 数组中的所有元素两两不同。
- 数组所有元素的最大公约数为 k。
- 数组元素之和尽可能小。
任务是输出该数组元素之和的最小值。
测试样例
样例 1:
输入:
n = 3 ,k = 1
输出:6
样例 2:
输入:
n = 2 ,k = 2
输出:6
样例 3:
输入:
n = 4 ,k = 3
输出:30
解题思路
要解决这个问题,我们需要构造一个满足以下条件的数组:
- 所有元素两两不同。
- 所有元素的最大公约数(GCD)为 k。
- 数组元素之和尽可能小。
关键观察:
- GCD 为 k:这意味着所有元素都必须是 k的倍数。因此,我们可以将问题转化为构造一个数组,其中每个元素除以k后,这些新元素的最大公约数为 1。
- 元素两两不同:为了确保元素不同,我们可以选择最小的 n个不同的正整数,然后将它们乘以k。
- 和最小:为了使和最小,我们应该选择最小的 n个不同的正整数,即1, 2, 3, ..., n,然后将它们乘以k。这样,数组的和就是k * (1 + 2 + ... + n) = k * n * (n + 1) / 2。
验证:
- 对于样例 1:n = 3, k = 1,和为1 * (1 + 2 + 3) = 6,与输出一致。
- 对于样例 2:n = 2, k = 2,和为2 * (1 + 2) = 6,与输出一致。
- 对于样例 3:n = 4, k = 3,和为3 * (1 + 2 + 3 + 4) = 30,与输出一致。
代码实现
function solution(n, k) {
    // 计算前 n 个正整数的和,然后乘以 k
    return k * n * (n + 1) / 2;
}
function main() {
    console.log(solution(3, 1) === 6); // true
    console.log(solution(2, 2) === 6); // true
    console.log(solution(4, 3) === 30); // true
}
main();
代码解释:
- **solution(n, k)**:计算前n个正整数的和(即n * (n + 1) / 2),然后乘以k,得到满足条件的最小和。
- **main()**:测试函数,验证三个样例的输出是否正确。
这个解法的时间复杂度是 O(1),空间复杂度也是 O(1),是最优的。
以上关于14. 数组元素之和最小化的文章就介绍到这了,更多相关内容请搜索码云笔记以前的文章或继续浏览下面的相关文章,希望大家以后多多支持码云笔记。
声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若内容造成侵权/违法违规/事实不符,请将相关资料发送至 admin@mybj123.com 进行投诉反馈,一经查实,立即处理!
重要:如软件存在付费、会员、充值等,均属软件开发者或所属公司行为,与本站无关,网友需自行判断
码云笔记 » 14. 数组元素之和最小化
    如若内容造成侵权/违法违规/事实不符,请将相关资料发送至 admin@mybj123.com 进行投诉反馈,一经查实,立即处理!
重要:如软件存在付费、会员、充值等,均属软件开发者或所属公司行为,与本站无关,网友需自行判断
码云笔记 » 14. 数组元素之和最小化
 
         码云
码云            
 微信
微信 支付宝
支付宝 
           
           
           
          