AI刷题实践 | 豆包MarsCode AI刷题

133 阅读6分钟

AI刷题的优势

智能纠错功能

在我们进行刷题的过程中,我们会遇到一些语法的错误,这些错误会导致我们的代码无法正确运行。如果在没有AI的情况下,我们可能要花一些时间去寻找这个错误的地方,并通过查找资料,来解决这个问题,但在AI刷题的过程中,我们可以很快的查找到这个错误,并且让AI帮助我们修改过来,并且解释这个函数的运用方法,这可以极大的缩短我们的学习时间,显著的提高我们的学习效率。这是我的一个学习案例。在我用AI刷题写最大矩形面积问题时,我先通过自己的思路写出了我认为正确的代码,但当我运行时却发现运行错误的提示,这时错误的旁边有一个AI FIX,我们点击这个按钮,AI就会帮我们分析错误,我们可以通过分析的内容进行纠错。程序可以正常运行时,我的代码还是存在一些问题,我又询问AI:“分析我的解题思路是否正确”。这时AI就会给出你的代码中存在的问题,并给出解决方案。

问题的分析功能

在我们分析问题的过程中,我们总会遇到一些我们看不懂或容易看错的题目,这时,AI就可以帮助我们分析问题,通过逐步的分析我们可以了找到解题的思路。   这是我在解最大矩形面积问题时的案例。 这是题目‘小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) 的最大值’ 这很容易让人错误理解为只需要计算整个数组的最小值乘以数组长度,而不是任意 k 个相邻元素所能形成的最大矩形面积。 让AI进行分析,你会得到每一步的具体实施方法。这样可以提高我们的题目理解的速度,以帮助我们更专注于编程。

知识点的总结

为了提高我们对知识的掌握能力,在我们做完题后都会进行知识点的总结,方便我们日后复习,这时AI就可以通过我们的代码,来总结我们的解题思路和方法技巧,这样我们可以更快的进行知识点的总结。AI帮我们总结的内容更加详细,有代码作为参考。 这是最大矩形问题的知识点总结:在解决这个问题时,涉及到了几个重要的编程和算法知识点。以下是对这些知识点的总结:

1. 滑动窗口(Sliding Window)

  • 概念:滑动窗口是一种用于解决数组/字符串子数组/子串问题的技术。通过维护一个窗口(通常是一个子数组或子串),可以在不重复计算的情况下高效地解决问题。
  • 应用:在本题中,滑动窗口用于遍历数组中所有可能的 k 个相邻元素,计算每个窗口内的最小值。

2. 单调栈(Monotonic Stack)

  • 概念:单调栈是一种特殊的栈,栈中的元素保持单调递增或单调递减的顺序。通常用于解决与“下一个更大/更小元素”相关的问题。
  • 应用:在本题中,单调栈用于高效地计算每个元素作为最小值时,能够形成的最大矩形面积。通过维护一个单调递增的栈,可以在 O(n) 时间内找到每个元素的左右边界。

3. 最小值计算

  • 概念:在数组中找到最小值是一个常见的操作。通常可以通过遍历数组来实现,时间复杂度为 O(n)
  • 应用:在本题中,需要计算任意 k 个相邻元素的最小值,并将其乘以 k 得到矩形面积。

4. 动态规划(Dynamic Programming)

  • 概念:动态规划是一种通过将问题分解为子问题并存储子问题的解来解决复杂问题的方法。通常用于优化递归算法,避免重复计算。
  • 应用:虽然本题没有直接使用动态规划,但动态规划的思想可以用于优化某些步骤,例如存储已经计算过的最小值,避免重复计算。

5. 时间复杂度分析

  • 概念:时间复杂度是衡量算法效率的重要指标,表示算法运行时间随输入规模增长的变化趋势。
  • 应用:在本题中,需要分析不同算法的复杂度,选择最优的算法。例如,使用单调栈可以将时间复杂度从 O(n^3) 优化到 O(n)

6. 边界条件处理

  • 概念:在编写代码时,需要考虑各种边界条件,确保代码在所有情况下都能正确运行。
  • 应用:在本题中,需要处理数组长度为 1 的情况,以及数组中所有元素都相同的情况。

示例代码中的知识点应用

def solution(n, array):
    max_area = 0
    stack = []
    
    for i in range(n):
        while stack and array[stack[-1]] >= array[i]:
            h = array[stack.pop()]
            w = i if not stack else i - stack[-1] - 1
            max_area = max(max_area, h * w)
        stack.append(i)
    
    while stack:
        h = array[stack.pop()]
        w = n if not stack else n - stack[-1] - 1
        max_area = max(max_area, h * w)
    
    return max_area

if __name__ == "__main__":
    print(solution(5, [1, 2, 3, 4, 5]) == 9)
    print(solution(6, [5, 4, 3, 2, 1, 6]) == 9)
    print(solution(4, [4, 4, 4, 4]) == 16)

知识点应用分析

  1. 单调栈

    • 使用单调栈来维护当前元素的左右边界,从而在 O(n) 时间内计算出最大矩形面积。
    • 通过 while stack and array[stack[-1]] >= array[i] 来维护单调递增的栈。
  2. 边界条件处理

    • 在遍历结束后,处理栈中剩余的元素,确保所有元素都被正确计算。
  3. 时间复杂度优化

    • 通过单调栈将时间复杂度从 O(n^3) 优化到 O(n)

由此我们可以看出,AI总结的内容是十分详细的。