掘金刷题之路 Day 7 | 豆包MarsCode AI刷题

201 阅读4分钟

贪心猫的鱼干大分配

随着编程学习的深入,算法题在培养逻辑思维和锻炼代码能力上扮演了重要角色。在这个过程中,使用 MarsCode AI 工具,可以有效提升刷题效率、优化解题体验。以下通过一个具体案例,分析该工具如何帮助完成算法题目,并总结 AI 的优势之处。

实践案例:贪心猫的鱼干大分配

题目描述

在猫星球上,每只猫根据等级获得一定数量的鱼干,满足以下规则:

  1. 每只猫至少获得 1 斤鱼干;
  2. 如果一只猫的等级高于相邻的猫,它需要比相邻的猫获得更多的鱼干。

目标是计算满足以上规则所需的最少鱼干总量。

AI 的辅助解决过程

以下是 MarsCode AI 在解决该问题中的具体帮助:

1. 快速理清思路,制定解题步骤

MarsCode AI 能够通过简明的逻辑分析快速提供解题思路:

  • 初始化:每只猫至少分配 1 斤鱼干。
  • 从左到右遍历:保证每只猫比前一只等级高时分得更多鱼干。
  • 从右到左遍历:修正可能因单向遍历导致的分配不公平。
  • 计算总量:最终累加所有猫的鱼干。

这种思路分解清晰且高效,省去了自己独立摸索的时间。

2. 代码模板的生成

在明确了解题思路后,MarsCode AI 快速生成 Java 代码实现,完整示例如下:

public static int solution(int n, List<Integer> cats_levels) {
    int[] fish = new int[n];
    for (int i = 0; i < n; i++) {
        fish[i] = 1;
    }

    for (int i = 1; i < n; i++) {
        if (cats_levels.get(i) > cats_levels.get(i - 1)) {
            fish[i] = fish[i - 1] + 1;
        }
    }

    for (int i = n - 2; i >= 0; i--) {
        if (cats_levels.get(i) > cats_levels.get(i + 1)) {
            fish[i] = Math.max(fish[i], fish[i + 1] + 1);
        }
    }

    int totalFish = 0;
    for (int i = 0; i < n; i++) {
        totalFish += fish[i];
    }

    return totalFish;
}

通过 AI 的代码生成,可以确保算法逻辑正确并避免语法问题。同时,代码清晰易读,方便进一步优化或调试。

3. 帮助测试与验证

MarsCode AI 自动生成多组测试样例,并提供预期输出以验证代码正确性:

  • 测试样例 1:输入 n = 3, cats_levels = [1, 2, 2],输出应为 4
  • 测试样例 2:输入 n = 6, cats_levels = [6, 5, 4, 3, 2, 16],输出应为 17
  • 测试样例 3:输入较长数组,验证算法性能。

实际运行后发现,程序成功通过所有样例,证明算法有效性。

4. 复杂场景的优化建议

AI 在解决问题的同时,还提供了优化建议。例如:

  • 时间复杂度分析:遍历两次数组,时间复杂度为 (O(n)),空间复杂度为 (O(n))。如果进一步优化空间,可在原地修改数组。
  • 适用场景拓展:类似问题还可以应用于奖金分配、任务调度等场景。

AI 帮助学习的优势

  1. 高效思路引导
    MarsCode AI 能够快速分析问题并提供详细的解题思路,避免陷入无效思考。
  2. 代码生成与优化
    自动生成代码并保证逻辑正确,同时输出的代码简洁易懂,方便学习者吸收。
  3. 丰富的测试与验证
    AI 自动生成测试用例,帮助检测程序正确性并确保边界情况被覆盖。
  4. 高效学习反馈
    通过对代码性能和适用场景的分析,让学习者深入理解算法原理及其扩展应用。
  5. 节省时间成本
    从思路到实现,AI 工具减少了大量无效摸索时间,使学习更专注高效。

我的思考

这里我们使用贪心策略。 每次分配鱼干时,只需要考虑局部(相邻猫的等级关系),通过局部最优的分配,最终可以达到全局最优。

依次从左到右和从右到左遍历两次

为什么需要前后遍历两次?

单次遍历无法同时满足左右两边的条件。例如:

  • 从左到右遍历: 确保每只猫比左边等级高的猫多分配鱼干。
  • 从右到左遍历: 确保每只猫比右边等级高的猫多分配鱼干。

两次遍历的原因是:

  1. 第一遍(左到右): 确保左边条件满足,但可能忽略右边条件。
  2. 第二遍(右到左): 确保右边条件满足,同时保持左边已经满足的条件。

比如样例

输入: n=6, [1 2 3 2 1]

如果我们只从左遍历一次 则 1+2+3+1+1 = 8

实则正确的是 1+2+3+2+1 = 9

那是因为我们只确保了从左到右的递增序列而没确定从右到左的递增序列

总结

通过 MarsCode AI 工具的辅助,我能够高效解决猫星球鱼干分配问题,同时深入理解了分配问题的核心逻辑。这不仅提高了刷题效率,也优化了算法学习路径。AI 的强大功能让编程学习更具乐趣,同时能帮助我快速适应更复杂的算法问题。