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

94 阅读4分钟

小C希望构造一个包含n个元素的数组,使得:

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

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

思路分析

1. 数组元素两两不同

  • 这意味着数组中的每个元素必须是不同的整数。

2. 数组元素的最大公约数为 k

  • 这意味着我们需要找到一个包含n个元素的数组,使得它们的最大公约数是 k。我们可以通过让数组中的每个元素都等于 k 的倍数来满足这一条件。
  • 更具体地说,如果我们选择数组的元素为 k * a1, k * a2, ..., k * an,其中 a1, a2, ..., an 是 n 个互不相同的整数,且它们的最大公约数为 1,那么数组的最大公约数就等于 k。

3. 数组元素之和尽可能小

  • 为了使数组的元素和尽可能小,我们应当尽量选择最小的不同整数 a1, a2, ..., an,使得这些整数的最大公约数为 1。最小的这类整数是 1, 2, 3, ..., n。
  • 因此,我们可以选择数组中的元素为:k * 1, k * 2, k * 3, ..., k * n。这些元素的最大公约数是 k,且它们的和是最小的。

公式推导

  • 数组中的元素是 k * 1, k * 2, ..., k * n,它们的和为:

    k×(1+2+3+...+n)=k×n(n+1)2k×(1+2+3+...+n)=k×2n(n+1)​

    其中,1 + 2 + 3 + ... + n 是前 n 个正整数的和,公式为 n(n+1)22n(n+1)​。

因此,最终的数组元素之和为:

最小和=k×n(n+1)2最小和=k×2n(n+1)​

代码实现

pythonCopy Code
def solution(n: int, k: int) -> int:
    # 计算前 n 个正整数的和,公式为 n * (n + 1) // 2
    sum_n = n * (n + 1) // 2
    # 乘以 k 得到最小和
    return sum_n * k

# 测试样例
if __name__ == '__main__':
    print(solution(n=3, k=1) == 6)   # 输出: 6
    print(solution(n=2, k=2) == 6)   # 输出: 6
    print(solution(n=4, k=3) == 30)  # 输出: 30

代码详解

  1. 计算前 n 个正整数的和

    • 使用公式 n(n+1)22n(n+1)​ 来快速计算前 n 个正整数的和。这个公式是数学中已知的求和公式,可以在常数时间 O(1)O(1) 内完成计算。
  2. 乘以 k 得到最小和

    • 由于数组中的每个元素都需要是 k 的倍数,我们将前 n 个正整数的和乘以 k,得到最终的最小和。
  3. 返回结果

    • 计算并返回最小和。

复杂度分析

  • 时间复杂度:O(1)O(1),因为计算前 n 个正整数的和只需要常数时间。
  • 空间复杂度:O(1)O(1),没有使用额外的空间。

测试样例

样例 1

输入:

Copy Code
n = 3, k = 1

输出:

Copy Code
6

解析

  • 数组为 1, 2, 3,和为 6,最大公约数为 1,满足条件。

样例 2

输入:

Copy Code
n = 2, k = 2

输出:

Copy Code
6

解析

  • 数组为 2, 4,和为 6,最大公约数为 2,满足条件。

样例 3

输入:

Copy Code
n = 4, k = 3

输出:

Copy Code
30

解析

  • 数组为 3, 6, 9, 12,和为 30,最大公约数为 3,满足条件。

学习总结

  1. 数学公式的运用:本题的关键是识别出需要选择数组元素为 k * 1, k * 2, ..., k * n 这样的形式,从而通过数学公式快速计算出元素和。通过对数学公式的理解,可以大大提高解题效率。
  2. 贪心思想:本题是一个典型的贪心问题,通过选择最小的正整数 1, 2, 3, ..., n 来确保元素和最小,同时保证元素的最大公约数为 k。
  3. 时间和空间复杂度:由于我们使用了直接的数学计算方法,时间复杂度和空间复杂度都非常低,这也是算法优化的重要体现。

学习计划

  • 基础数学知识:要解答类似的题目,掌握基本的数学公式和算法是非常有帮助的,特别是对常见求和公式、最大公约数等数学概念的理解。

  • 刷题方法

    • 对于初学者来说,可以先从基础的数学题目和简单的数组题目入手,逐渐提高难度。
    • 建议在刷题时,不仅要关注解法,还要注重思考题目背后的数学原理。
  • 错题分析:遇到不会的题目时,及时分析错题,并查阅相关知识点。可以通过总结错题来强化自己的知识结构,避免以后再犯类似的错误。

工具运用

  • AI辅导:利用 AI 刷题助手可以快速验证自己对解题思路的理解,尤其是在遇到卡壳时,可以通过 AI 提供的思路帮助理解题目。结合 AI 和其他学习资源,如算法书籍、视频教程等,能够更全面地掌握算法技巧。
  • 学习资源整合:除了刷题,还可以通过阅读一些经典算法书籍,或参加一些在线算法比赛来提高自己的解题能力。