面试官说来~做下这道题:数组元素之和最小化

109 阅读2分钟

【算法刷题】观光景点组合得分问题 副本.png

问题描述

小C希望构造一个包含n个元素的数组,且满足以下条件:

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

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


测试样例

样例1:

输入:n = 3 ,k = 1
输出:6

样例2:

输入:n = 2 ,k = 2
输出:6

样例3:

输入:n = 4 ,k = 3
输出:30

解题思路

  1. 理解最大公约数为 k:这意味着数组中的每个元素都必须是 k 的倍数。
  2. 数组元素两两不同:我们需要确保数组中的元素是唯一的。
  3. 数组元素之和尽可能小:为了满足这个条件,我们可以从 k 开始,依次选择 k 的倍数,直到数组中有 n 个元素。

代码提示

我们可以通过以下步骤来实现这个逻辑:

  1. 初始化一个空数组,用于存储满足条件的元素。
  2. 从 k 开始,依次选择 k 的倍数,并检查是否已经在数组中。
  3. 直到数组中有 n 个元素,计算这些元素的和。

代码示例-python实现

def solution(n: int, k: int) -> int:
    # 初始化一个空数组来存储满足条件的元素
    elements = []
    
    # 从 k 开始,依次选择 k 的倍数
    current = k
    while len(elements) < n:
        # 如果当前元素不在数组中,添加到数组
        if current not in elements:
            elements.append(current)
        # 移动到下一个 k 的倍数
        current += k
    
    # 计算数组元素之和
    result = sum(elements)
    
    return result

if __name__ == '__main__':
    print(solution(n = 3, k = 1) == 6)
    print(solution(n = 2, k = 2) == 6)
    print(solution(n = 4, k = 3) == 30)

关键步骤

  • 初始化数组elements = []
  • 选择 k 的倍数current = k
  • 检查并添加元素if current not in elements: elements.append(current)
  • 移动到下一个 k 的倍数current += k
  • 计算和返回结果result = sum(elements)

通过这种方式,可以确保数组中的所有元素两两不同。每次添加元素之前,都会检查该元素是否已经存在于数组中,只有在不存在的情况下才会添加。这样可以保证数组中的元素是唯一的。