返回

滑动窗口算法及其运用,助你应对常见带“连续、最、子”的难题!

前端

尺取法,又名滑动窗口法,在解决连续、最、子问题的算法中大显身手。这些问题往往伴随着“连续”、“最”或“子”等。掌握尺取法的关键在于充分理解问题含义,辨识出这些关键词,并将其转化为算法实现中的具体操作。尺取法以两个指针——滑动窗口的左右指针,在序列中不断移动,选出窗口子序列。具体实现时,左指针控制窗口起始位置,右指针控制窗口结束位置。尺取法在诸多问题中展现了非凡的威力。

1. 长度最小的子数组

假设我们有一个数组,其中的元素均为非负数,你的任务是找出其中长度最小的连续子数组,使得子数组元素和大于或等于某个目标值。尺取法在这个问题中发挥了重要作用。

我们首先使用一个变量sum来记录当前窗口子序列的和,以及两个指针left和right来表示窗口的左右边界。初始时,将left和right指针均指向数组的第一个元素,然后逐步向右移动right指针,直到sum大于或等于目标值。此时,如果当前窗口长度小于之前记录的最小长度,则更新最小长度及其对应的左右指针位置。随后,移动left指针,使窗口长度减小,同时更新sum值。不断重复以上操作,直到right指针到达数组末尾。

2. 无重复字符的最长子串

给定一个字符串,你的任务是找出其中最长的不包含重复字符的子串。同样,尺取法可以帮助我们解决这个问题。

我们同样使用两个指针left和right,初始时均指向字符串的第一个字符。我们通过移动right指针来扩展窗口,直到遇到重复字符。此时,我们将left指针移动到重复字符的下一个字符处,并更新窗口子串的长度。重复上述步骤,直到right指针到达字符串末尾。通过不断更新窗口长度,我们可以找出最长的不包含重复字符的子串。

3. 最大连续1的个数 III

给定一个由0和1组成的数组,你的任务是找出其中最长连续1的个数,最多允许有k个0。这个看似复杂的问题也可以通过尺取法迎刃而解。

我们使用left和right两个指针来控制窗口的边界。初始时,将left和right指针均指向数组的第一个元素。当窗口中0的个数不超过k时,我们将right指针向右移动,直到遇到第k+1个0。此时,我们将left指针移动到第k+1个0的下一个元素处,并更新窗口长度。不断重复以上操作,直到right指针到达数组末尾。通过更新窗口长度,我们可以找出最长连续1的个数。

尺取法在解决连续、最、子问题的算法中发挥了重要的作用。通过巧妙地使用两个指针——滑动窗口的左右指针,在序列中移动以选出窗口子序列,尺取法可以高效地解决这些问题,并且时间复杂度远小于暴力破解。尺取法展现了算法的简洁性和高效性,是算法设计中一颗璀璨的明珠。