返回
用一道题练透快慢指针 - LeetCode 1894. 找到需要补充粉笔的学生编号!
前端
2023-10-23 11:29:06
快慢指针的精髓
快慢指针是一种常见的算法技术,主要用于在数组或链表等数据结构中进行查找或更新操作。它之所以被称为“快慢指针”,是因为它使用两个指针来同时遍历数据结构,其中一个指针的移动速度比另一个指针更快。
在 LeetCode 1894 中,我们需要找到需要补充粉笔的学生编号。为了解决这个问题,我们可以使用快慢指针来遍历学生数组。具体来说,我们可以让慢指针指向当前正在回答问题的学生,而快指针指向下一个需要回答问题的学生。
当慢指针回答完问题后,它会将手中的粉笔交给快指针,然后快指针继续向前移动,指向下一个需要回答问题的学生。如果快指针在移动过程中发现剩余粉笔数量不足以回答问题,那么我们就需要记录下这个学生的编号,因为他们需要补充粉笔。
LeetCode 1894 解题步骤
- 初始化两个指针,慢指针指向第一个学生,快指针指向第二个学生。
- 循环遍历学生数组,直到快指针到达数组末尾。
- 在每次循环中,慢指针回答完问题后,将手中的粉笔交给快指针。
- 如果快指针在移动过程中发现剩余粉笔数量不足以回答问题,那么我们就需要记录下这个学生的编号。
- 返回所有需要补充粉笔的学生编号。
代码实现
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 是一个经典的快慢指针问题。通过这篇文章,我们详细分析了如何使用快慢指针来解决这个问题。同时,我们也掌握了快慢指针的精髓,并了解了如何将其应用于解决更复杂的编程问题。