DAY 6 学习体验与故事-------最大乘积问题 | 豆包MarsCode AI刷题

140 阅读5分钟

刷题故事与体验

一、使用AI刷题功能的初体验

在学习编程的过程中,我曾经历过一种困惑,那就是面对一些算法题时,虽然明白思路,但总是会在细节上卡壳,或者由于多次尝试未果而感到沮丧。直到我开始使用AI刷题功能,才发现自己的学习效率大大提高了。通过和AI的互动,我不仅能够更快速地理解题目背后的逻辑,还能获得即时的反馈和改进建议。这种辅助功能为我带来了前所未有的学习体验,特别是在做题的过程中,每当我攻克一道难题时,心中的成就感是无与伦比的。

在使用AI刷题的过程中,我特别记得有一次我遇到了一个挑战性较强的问题,题目如下:

问题描述:

有一个包含N个元素的数组,记作a1, a2, ..., aN。定义两个函数L(i)和R(i),L(i)是满足条件j < ia[j] > a[i]的最大j值;如果找不到,L(i) = 0;R(i)是满足条件k > ia[k] > a[i]的最小k值;如果找不到,R(i) = 0。最终,定义MAX(i) = L(i) * R(i),要求我们找到1 ≤ i ≤ N中MAX(i)的最大值。

二、如何使用AI高效解决问题

当我第一次看到这个问题时,我感觉有些复杂。问题的核心是在数组中对于每个元素寻找左边和右边满足特定条件的元素,这让我想到了“单调栈”的应用。虽然我知道这是一个典型的“单调栈”问题,但我依然有些不确定如何去优化实现,尤其是在时间复杂度和空间复杂度的平衡上。

于是,我向AI提问:“这个问题能不能用单调栈来解决?怎么高效地求解L(i)和R(i)?”AI很快给出了答案,并且详细解释了如何构建单调栈:

  1. L(i)的求解:

    • 从左到右遍历数组,使用栈保存当前元素的下标。
    • 对于每个元素a[i],我们依次从栈顶弹出不满足a[j] > a[i]的元素,直到找到符合条件的最大j,或者栈为空。
    • 最终,栈顶的元素就是L(i)的值。
  2. R(i)的求解:

    • 从右到左遍历数组,类似的,使用栈保存当前元素的下标。
    • 对于每个元素a[i],我们依次从栈顶弹出不满足a[k] > a[i]的元素,直到找到符合条件的最小k,或者栈为空。
    • 最终,栈顶的元素就是R(i)的值。

AI还提示我,在求解L(i)和R(i)时,单调栈的时间复杂度为O(N),从而整个问题的时间复杂度可以优化到O(N),这让我更加确信单调栈是解决这个问题的关键。

三、解决问题的实现过程

在得到了AI的提示后,我按照以下步骤实现了这个算法:

def max_product(n, array):
    # 初始化L和R
    L = [0] * n
    R = [0] * n

    # 求L(i)(左侧第一个大于当前元素的元素的下标)
    stack = []
    for i in range(n):
        while stack and array[stack[-1]] <= array[i]:
            stack.pop()
        if stack:
            L[i] = stack[-1] + 1  # 记录1-based下标
        stack.append(i)

    # 求R(i)(右侧第一个大于当前元素的元素的下标)
    stack = []
    for i in range(n - 1, -1, -1):
        while stack and array[stack[-1]] <= array[i]:
            stack.pop()
        if stack:
            R[i] = stack[-1] + 1  # 记录1-based下标
        stack.append(i)

    # 计算MAX(i)并找到最大值
    max_value = 0
    for i in range(n):
        if L[i] != 0 and R[i] != 0:
            max_value = max(max_value, L[i] * R[i])

    return max_value

四、与同学一起竞争进步的经历

这道题目刚好在我和同学们的编程小组中成为了一个讨论的焦点。在我掌握了解决问题的方法后,我与同学们分享了AI提供的思路和我的实现方式。大家都觉得通过单调栈可以在O(N)的时间复杂度内解决这个问题,之前我们都习惯于用O(N^2)的暴力解法,这样的优化无疑是一次质的飞跃。

有一位同学一开始对这个问题并不感兴趣,但当他看到我的实现后,他突然产生了浓厚的兴趣。我们一起讨论了单调栈的使用技巧,分析了如何高效地处理大规模数据。他也逐渐掌握了这个技巧,开始挑战更复杂的题目。通过这种竞争与合作,我们都取得了很大的进步。

五、AI对我的学习带来的深远影响

通过这段时间的刷题,我深刻感受到AI在编程学习中的巨大作用。以前我可能会因为遇到困难而放弃,但现在AI能够在我遇到瓶颈时及时提供提示和思路,帮助我顺利突破。最重要的是,AI不仅仅是给出了答案,而是通过引导我理解问题背后的算法思想,帮助我形成了更清晰的编程思维。

AI在教育领域的应用让我意识到,学习不再是单纯的死记硬背,而是可以通过智能工具进行高效的知识传播和实践。在未来,随着AI技术的不断进步,它将为更多学生提供个性化的学习体验,帮助我们快速掌握各种技能,弥补传统教育中的一些不足。

六、总结

使用AI刷题功能,不仅让我在技术上获得了突破,也让我在学习态度和方法上发生了变化。通过与AI的互动,我学会了如何分析问题,找到最优解法,并能够迅速纠正自己思路中的错误。这种高效、智能化的学习方式,让我更加热爱编程,也让我在不断解决问题的过程中,体验到了成长的喜悦。

总的来说,AI不仅改变了我的学习方式,也让我对未来的教育和技术充满了期待。通过AI的辅助,我相信自己能够更高效、更有深度地掌握编程和其他技能,迎接更加丰富的学习挑战。