返回

用一道题练透快慢指针 - LeetCode 1894. 找到需要补充粉笔的学生编号!

前端

快慢指针的精髓

快慢指针是一种常见的算法技术,主要用于在数组或链表等数据结构中进行查找或更新操作。它之所以被称为“快慢指针”,是因为它使用两个指针来同时遍历数据结构,其中一个指针的移动速度比另一个指针更快。

在 LeetCode 1894 中,我们需要找到需要补充粉笔的学生编号。为了解决这个问题,我们可以使用快慢指针来遍历学生数组。具体来说,我们可以让慢指针指向当前正在回答问题的学生,而快指针指向下一个需要回答问题的学生。

当慢指针回答完问题后,它会将手中的粉笔交给快指针,然后快指针继续向前移动,指向下一个需要回答问题的学生。如果快指针在移动过程中发现剩余粉笔数量不足以回答问题,那么我们就需要记录下这个学生的编号,因为他们需要补充粉笔。

LeetCode 1894 解题步骤

  1. 初始化两个指针,慢指针指向第一个学生,快指针指向第二个学生。
  2. 循环遍历学生数组,直到快指针到达数组末尾。
  3. 在每次循环中,慢指针回答完问题后,将手中的粉笔交给快指针。
  4. 如果快指针在移动过程中发现剩余粉笔数量不足以回答问题,那么我们就需要记录下这个学生的编号。
  5. 返回所有需要补充粉笔的学生编号。

代码实现

def chalkReplacer(chalk: List[int], k: int) -> int:
    # 初始化两个指针
    slow = 0
    fast = 1

    # 循环遍历学生数组
    while True:
        # 慢指针回答完问题后,将手中的粉笔交给快指针
        chalk[slow] -= k
        
        # 如果慢指针的粉笔数量不足以回答问题,那么我们就需要记录下这个学生的编号
        if chalk[slow] < 0:
            return slow
        
        # 快指针移动到下一个学生
        fast = (fast + 1) % len(chalk)
        
        # 如果快指针到达数组末尾,那么我们就需要重新开始循环
        if fast == 0:
            slow = (slow + 1) % len(chalk)
            fast = (slow + 1) % len(chalk)

总结

LeetCode 1894 是一个经典的快慢指针问题。通过这篇文章,我们详细分析了如何使用快慢指针来解决这个问题。同时,我们也掌握了快慢指针的精髓,并了解了如何将其应用于解决更复杂的编程问题。