青训营X豆包MarsCode 技术训练营第六篇 | 豆包MarsCode AI 刷题

99 阅读3分钟

学习笔记:最小和数组构造问题

题目解析

问题描述:

我们需要构造一个长度为 nn 的数组,满足以下条件:

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

目标: 输出满足条件的数组元素之和的最小值。


思路解析

关键观察:

  1. 最大公约数为 kk: 如果数组的最大公约数为 kk,那么数组的每个元素都必须是 kk 的倍数。 我们可以将数组构造为:

    a=[k,2k,3k,…,nk]a = [k, 2k, 3k, \ldots, nk]

    这样,数组的最大公约数显然为 kk。

  2. 两两不同: 上述数组中的每个元素显然两两不同,因为 k,2k,…,nkk, 2k, \ldots, nk 是 kk 的不同倍数。

  3. 和尽可能小: 在上述构造中,元素之和为:

    k×(1+2+3+…+n)=k×n(n+1)2k \times (1 + 2 + 3 + \ldots + n) = k \times \frac{n(n + 1)}{2}

    这个构造保证了数组元素之和最小。


代码实现

def solution(n: int, k: int) -> int:
    # 数组和最小值公式
    return k * (n * (n + 1) // 2)
​
if __name__ == '__main__':
    print(solution(n=3, k=1))  # 输出: 6
    print(solution(n=2, k=2))  # 输出: 6
    print(solution(n=4, k=3))  # 输出: 30

样例解析

  1. 样例 1: 输入:n=3,k=1n = 3, k = 1 构造的数组为:[1, 2, 3] 数组和为:1+2+3=61 + 2 + 3 = 6
  2. 样例 2: 输入:n=2,k=2n = 2, k = 2 构造的数组为:[2, 4] 数组和为:2+4=62 + 4 = 6
  3. 样例 3: 输入:n=4,k=3n = 4, k = 3 构造的数组为:[3, 6, 9, 12] 数组和为:3+6+9+12=303 + 6 + 9 + 12 = 30

复杂度分析

  • 时间复杂度: 构造数组和计算和的公式均为常数时间,时间复杂度为 O(1)O(1)。
  • 空间复杂度: 仅使用常数空间,空间复杂度为 O(1)O(1)。

知识总结

  1. 最大公约数(GCD)的特性: 数组的所有元素必须是 kk 的倍数,最大公约数才能是 kk。

  2. 数学公式应用: 等差数列求和公式:

    Sum=n(n+1)2\text{Sum} = \frac{n(n + 1)}{2}

  3. 贪心思想: 在满足条件的前提下,优先选择最小的元素,确保数组和最小。


学习建议

  1. 理解问题约束: 理解题目中的关键条件(如 GCD、两两不同),能帮助快速确定解题思路。
  2. 数学归纳和简化: 尽量利用数学公式或特性(如等差数列求和)简化代码和计算。
  3. 练习更多构造类问题: 如数组构造、字符串构造题目,提升思维灵活性。

总结

通过分析题目条件,运用数学推导可以直接得出数组和的最优公式,体现了数学与编程结合的重要性。这道题目是理解 GCD 应用和数组构造问题的经典案例。