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

62 阅读3分钟

问题描述

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

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

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

测试样例

样例1:

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

样例2:

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

问题分析

  1. 数组中的所有元素两两不同:这意味着我们需要生成一个包含 n 个不同元素的数组。
  2. 数组所有元素的最大公约数为 k:这意味着数组中的每个元素都必须是 k 的倍数。
  3. 数组元素之和尽可能小:我们需要找到 n 个 k 的倍数,使得它们的和最小。

解题思路

  1. 初始化:从k开始,因为k是所有元素的最小公倍数,这样可以保证所有元素都是k的倍数
  2. 生成数组:通过循环n次,每次将当前元素加入总和,并更新当前元素为下一个k的倍数,这样可以保证所有元素都是不同的,并且是k的倍数。
  3. 最小化元素之和:由于我们是从k开始,每次增加k,这样可以保证元素之和最小,因为任何小于k的k的倍数都会增加其他元素的值,从而增加总和。

代码实现

python:

def solution(n: int, k: int) -> int:
    # 初始化数组和当前元素
    current_element = k
    total_sum = 0
    
    # 生成 n 个不同的元素
    for _ in range(n):
        # 将当前元素加入总和
        total_sum += current_element
        # 更新当前元素,确保下一个元素是不同的
        current_element += k
    
    return total_sum

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. 初始化:确保 current_element 从 k 开始。
  2. 循环生成数组:每次循环中,将 current_element 加入 total_sum,并更新 current_element 为下一个 k 的倍数。
  3. 返回结果:循环结束后,返回 total_sum

时间复杂度

  • 初始化和返回结果的时间复杂度都是 O(1)
  • 循环的时间复杂度是 O(n)
总结
  1. 简单解决方案:在这个问题中,一个简单的解决方案就是从k开始,每次增加k,直到生成n个不同的元素。这种方法简单且有效,因为它直接满足了所有条件。
  2. 代码实现:代码实现应该简洁明了,易于理解和维护。在这个问题中,代码实现非常直接,没有复杂的逻辑。
  3. 时间复杂度:在这个问题中,时间复杂度是O(n),这是因为我们需要循环n次来生成数组。这是一个合理的时间复杂度,因为问题的性质决定了我们需要至少处理n次。