青训营X豆包MarsCode 技术训练营第三题 | 豆包MarsCode AI 刷题

49 阅读4分钟

问题描述

小S最近在分析一个数组 h1,h2,...,hNh1​,h2​,...,hN​,数组的每个元素代表某种高度。小S对这些高度感兴趣的是,当我们选取任意 kk 个相邻元素时,如何计算它们所能形成的最大矩形面积。

对于 kk 个相邻的元素,我们定义其矩形的最大面积为:

R(k)=k×min(h[i],h[i+1],...,h[i+k−1])R(k)=k×min(h[i],h[i+1],...,h[i+k−1])

即,R(k)R(k) 的值为这 kk 个相邻元素中的最小值乘以 kk。现在,小S希望你能帮他找出对于任意 kk,R(k)R(k) 的最大值。 #include #include #include // for std::min

int solution(int n, std::vector A) { int max_area = 0;

// 遍历所有可能的 k 值
for (int k = 1; k <= n; ++k) {
    // 遍历所有可能的起始位置
    for (int i = 0; i <= n - k; ++i) {
        // 计算当前子数组的最小值
        int min_height = A[i];
        for (int j = i; j < i + k; ++j) {
            min_height = std::min(min_height, A[j]);
        }
        // 计算当前子数组的矩形面积
        int current_area = k * min_height;
        // 更新最大面积
        max_area = std::max(max_area, current_area);
    }
}

return max_area;

}

int main() { // Add your test cases here std::vector A_case1 = std::vector{1, 2, 3, 4, 5}; std::cout << (solution(5, A_case1) == 9) << std::endl; return 0; }

  1. 问题分解:面对一个复杂的算法问题,首先需要将其分解为更小的、更易处理的部分。例如,在这个问题中,我们将问题分解为遍历所有可能的 k 值和起始位置,然后计算每个子数组的最小值和矩形面积。这种分解问题的能力是解决复杂算法问题的关键。
  2. 循环和条件语句的使用:在代码中,我们使用了嵌套的循环来遍历所有可能的子数组。这种结构在处理需要多次迭代的问题时非常有效。同时,我们还使用了条件语句(如 std::min 和 std::max)来更新最小值和最大面积,这展示了如何在循环中动态地更新变量。
  3. 数据结构的选择:在这个问题中,我们使用了 std::vector 来存储数组元素。std::vector 是一个动态数组,非常适合存储和操作一系列数据。选择合适的数据结构可以大大简化代码的实现和理解。
  4. 算法优化:虽然当前的代码已经能够解决问题,但在实际应用中,我们可能需要考虑算法的效率。例如,当前的代码时间复杂度为 O(n3),在处理大规模数据时可能会变得非常慢。未来可以考虑使用更高效的算法(如单调栈)来优化时间复杂度。
  5. 代码的可读性和可维护性:在编写代码时,保持代码的可读性和可维护性非常重要。例如,我们使用了清晰的变量命名和注释来解释代码的每个部分。这不仅有助于他人理解代码,也便于自己在未来回顾和修改代码。

使用AI的心得

在这次编程练习中,AI工具为我提供了极大的帮助。以下是我使用AI的一些心得体会:

  1. 快速获取解题思路:AI能够快速提供解题思路和代码框架,这大大节省了我思考和设计算法的时间。通过AI的提示,我能够更快地理解问题的核心,并找到解决问题的方向。
  2. 代码纠错和优化建议:AI不仅能够指出代码中的错误,还能提供优化建议。例如,AI提示我当前代码的时间复杂度较高,并建议我考虑使用更高效的算法。这种反馈对于提升代码质量和性能非常有帮助。
  3. 学习新知识和技巧:通过与AI的互动,我学到了许多新的编程技巧和算法思想。例如,AI建议使用单调栈来优化时间复杂度,这让我对这一算法有了更深入的了解。
  4. 提高编程效率:AI工具能够快速生成代码片段和测试用例,这大大提高了我的编程效率。我可以专注于解决问题的核心逻辑,而不必花费大量时间在代码的细节上。
  5. 持续学习和改进:使用AI工具让我意识到,编程是一个不断学习和改进的过程。通过与AI的互动,我能够不断发现自己的不足,并努力提升自己的编程能力。