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

16 阅读1分钟

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

数组元素之和最小化 - MarsCode

简单题,只需要从1*k开始贪心就好了


摘要

给定整数 nnkk,需要构造一个长度为 nn 的数组,使得:

  1. 数组元素两两不同。
  2. 数组所有元素的最大公约数为 kk
  3. 数组元素之和最小。

我们需要输出该数组元素之和的最小值。


问题描述

任务:构造一个满足条件的数组,并返回其最小和。

条件:

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

测试样例

示例 1

输入:

n = 3, k = 1

输出:

6

示例 2

输入:

n = 2, k = 2

输出:

6

示例 3

输入:

n = 4, k = 3

输出:

30

算法原理

核心思路

  1. 最大公约数的约束

    • 数组元素的最大公约数是 kk,这意味着数组中的每个元素必须是 kk 的倍数。
    • 因此,数组可以表示为: [ka1,ka2,,kan][k \cdot a_1, k \cdot a_2, \dots, k \cdot a_n] 其中,a1,a2,,ana_1, a_2, \dots, a_n 是两两不同的正整数。
  2. 最小化数组之和

    • 为了让数组之和最小,我们选择最小的 nn 个正整数: a1=1,a2=2,,an=na_1 = 1, a_2 = 2, \dots, a_n = n
    • 数组构造为: [k1,k2,,kn][k \cdot 1, k \cdot 2, \dots, k \cdot n]
  3. 计算总和

    • 数组的总和为: sum=k(1+2++n)\text{sum} = k \cdot (1 + 2 + \dots + n)
    • 根据等差数列求和公式: 1+2++n=n(n+1)21 + 2 + \dots + n = \frac{n \cdot (n + 1)}{2}
    • 代入计算: sum=kn(n+1)2\text{sum} = k \cdot \frac{n \cdot (n + 1)}{2}

时间复杂度

  1. 数组构造复杂度:O(1)O(1)
  2. 数组求和复杂度:O(1)O(1)

总时间复杂度O(1)O(1)


空间复杂度

只需要常量级空间。

总空间复杂度O(1)O(1)


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]。总和: sum=1+2+3=6\text{sum} = 1 + 2 + 3 = 6

示例 2:

输入:

n = 2, k = 2

数组构造为 [2, 4]。总和: sum=2+4=6\text{sum} = 2 + 4 = 6

示例 3:

输入:

n = 4, k = 3

数组构造为 [3, 6, 9, 12]。总和: sum=3+6+9+12=30\text{sum} = 3 + 6 + 9 + 12 = 30