迷人数列

181 阅读4分钟

题目解析 题目选择:  我选择了豆包MarsCode AI 刷题题库中的一道经典题目——“迷人数列”。题目要求统计一个数列中有多少个连续的子序列是“迷人的”,即子序列的最大值和最小值之差不超过某个给定的阈值 k

思路解析:

问题理解:  首先,我们需要理解什么是“迷人数列”。对于一个子序列,如果其最大值和最小值之差不超过 k,则该子序列是“迷人的”。

数据结构选择:  为了高效地找到子序列的最大值和最小值,我们可以使用双端队列(deque)来维护当前窗口的最大值和最小值。

算法步骤:

-   使用两个双端队列 `max_deque` 和 `min_deque` 分别维护当前窗口的最大值和最小值。
-   遍历数列,每次移动窗口时,更新这两个队列。
-   如果当前窗口的最大值和最小值之差超过 `k`,则移动窗口的起始位置,直到满足条件。
-   统计所有满足条件的子序列。

图解:

  • 假设数列为 [3, 1, 2, 4],阈值 k = 2
  • 初始窗口为 [3],最大值和最小值之差为 0,满足条件。
  • 移动窗口到 [3, 1],最大值和最小值之差为 2,满足条件。
  • 继续移动窗口,直到遍历完整个数列。

代码详解:

python

from collections import 

deque

def solution(n, k, sequence)

:

    max_deque = deque()

    min_deque = deque()

    count = 0

    left = 0

    for right in range(n):

        # 更新最大值队列

        while max_deque and 

        sequence[max_deque

        [-1]] <= sequence

        [right]:

            max_deque.pop()

        max_deque.append

        (right)

        # 更新最小值队列

        while min_deque and 

        sequence[min_deque

        [-1]] >= sequence

        [right]:

            min_deque.pop()

        min_deque.append

        (right)

        # 检查当前窗口是否满足

        条件

        while sequence

        [max_deque[0]] - 

        sequence[min_deque

        [0]] > k:

            if max_deque[0] 

            == left:

                max_deque.

                popleft()

            if min_deque[0] 

            == left:

                min_deque.

                popleft()

            left += 1

        # 统计满足条件的子序列

        数量

        count += (right - 

        left + 1)

    return count

知识总结

新知识点:

双端队列(deque):  在处理滑动窗口问题时,双端队列是一个非常有效的数据结构。它可以快速地在队列的两端进行插入和删除操作。 滑动窗口:  滑动窗口是一种常见的算法技巧,用于解决数组或链表中的子序列问题。通过维护一个窗口,可以高效地找到满足条件的子序列。

理解与建议:

双端队列的应用:  双端队列在处理滑动窗口问题时非常有用,尤其是在需要维护最大值和最小值的情况下。理解其工作原理和使用场景,可以帮助我们更好地解决类似问题。 滑动窗口的灵活性:  滑动窗口算法可以应用于多种场景,如字符串匹配、子数组问题等。掌握这一技巧,可以大大提高解题效率。

学习建议:

多练习:  通过大量的练习,熟悉双端队列和滑动窗口的使用场景和技巧。 总结归纳:  每次刷题后,总结遇到的问题和解决方法,形成自己的知识体系。 交流讨论  与其他同学交流讨论,分享解题思路和经验,互相学习。

学习计划

高效学习方法:

制定刷题计划  根据自己的时间和能力,制定一个合理的刷题计划。可以按照题目的难度和类型进行分类,逐步提高难度。 错题分析:  对于做错的题目,不仅要找出错误原因,还要深入分析问题的本质,避免再次犯同样的错误。 定期复习:  定期复习之前做过的题目,巩固知识点,加深理解。

错题学习:

记录错题:  将做错的题目记录下来,分析错误原因,并总结出解决方法。 针对性练习:  针对错题进行针对性练习,直到完全掌握相关知识点。

工具运用

AI 刷题功能:

智能推荐:  利用豆包MarsCode AI 的智能推荐功能,根据个人水平推荐合适的题目,提高学习效率。 错题分析:  AI 可以帮助分析错题,提供详细的错误原因和解决方法,帮助我们更好地理解问题。

结合其他资源:

在线课程:  结合在线课程学习相关知识点,加深理解。 论坛讨论:  参与编程论坛的讨论,与其他同学交流经验,互相学习。 书籍阅读:  阅读相关书籍,系统学习算法和数据结构知识。

实用建议: 多角度学习: 结合多种学习资源,从不同角度理解问题,提高学习效果。 持续学习:  编程是一个持续学习的过程,保持学习的热情和动力,不断提升自己的能力。