第六篇|MarsCode AI的使用(优化)|豆包MarsCode AI技术刷题

48 阅读3分钟

一、例题描述

小C 和小U 有两个数组,分别是 a 和 b,它们的长度相同。小U 想通过重新排列数组 a 的元素,来最小化 a 和 b 之间的差异。具体来说,他们要最小化所有元素差值绝对值之和,即 sum(abs(a[i] - b[i]))
你能帮助小C 和小U 找到这个最小化的值吗?


测试样例

样例1:

输入:a = [2, 1, 3, 2], b = [5, 2, 4, 2]
输出:5

样例2:

输入:a = [1, 4, 6], b = [2, 5, 7]
输出:3

样例3:

输入:a = [1, 9, 6], b = [2, 5, 7]
输出:4

二、代码展示

1.优化前

from itertools import permutations
def solution(a, b):
    min_diff = float('inf')
    for permutation in permutations(a):
        diff = sum(abs(x - y) for x, y in zip(permutation, b))
        min_diff = min(min_diff, diff)
    return min_diff

代码正确,但是时间复杂度较高,造成运行超时,无法提交成功。

全排列的使用: 使用了 itertools.permutations 来生成数组 a 的所有排列,这是正确的思路。但是,这种方法在数组长度较大时会非常耗时。

2.优化后

def solution(a, b):
    # 对数组 a 和 b 进行排序
    a.sort()
    b.sort()
    
    # 计算排序后的差异
    min_diff = sum(abs(x - y) for x, y in zip(a, b))
    
    return min_diff

if __name__ == '__main__':
    print(solution([2, 1, 3, 2], [5, 2, 4, 2]) == 5)
    print(solution([1, 4, 6], [2, 5, 7]) == 3)
    print(solution([1, 9, 6], [2, 5, 7]) == 4)
AI提供的优化思路
  1. 排序

    • 对数组 a 和 b 进行排序。
    • 然后按顺序匹配 a 和 b 的元素,这样可以最小化差异。
  2. 贪心匹配

    • 排序后,直接按顺序匹配 a 和 b 的元素,这样可以保证差异最小。
  • 通过排序和贪心匹配可以显著提高效率。
  • 优化后的代码时间复杂度为 (O(n \log n)),更适合处理较大的数组。

三、排序和贪心匹配

排序和贪心匹配能够最小化差异是因为:排序后的数组在匹配时能够最小化绝对差值的和

详细解释

  1. 排序的作用

    • 排序将数组中的元素按从小到大的顺序排列。
    • 排序后,数组 a 和 b 中的元素在位置上是对齐的,即 a[i] 和 b[i] 在排序后的数组中是相对应的。
  2. 贪心匹配的原理

  • 贪心匹配是指在每一步选择中都采取在当前看来最好的选择,以期望最终得到全局最优解。
  • 在排序后的数组中,按顺序匹配 a 和 b 的元素,可以保证每个元素对的差值尽可能小。
  • 具体来说,如果 a[i] 和 b[i] 是排序后的数组中的第 i 个元素,那么 abs(a[i] - b[i]) 是当前最小的可能差值。

四、优化功能的使用

当发现问题而不知道如何解决时,对于我这种基础薄弱的做题人,AI的优化功能起到了非常大的作用。

对于代码,它能迅速扫描,精准定位冗余与低效环节,以巧妙策略优化算法,大幅削减运行时间、降低资源消耗,让代码高效运行。 对像我一样的做题人而言,它是贴心的学习伙伴。当面对难题不知所措时,AI 优化功能可展示清晰的解题思路与代码优化范例,帮助理解复杂逻辑,快速掌握知识点。能助力做题人突破思维局限,提升编程技能,在代码的海洋里更加自信从容地遨游,轻松跨越重重挑战,高效达成学习与解题目标。