返回

前端算法之旅:多指针与滑动窗口的精彩世界

前端

在算法世界的浩瀚星海中,多指针和滑动窗口算法以其独特而有趣的解题方式脱颖而出。这些算法往往出人意料,但却妙不可言,在解决某些问题时展现出惊人的效率。

多指针:指引方向,化繁为简

多指针算法的精髓在于利用多个指针,从数组的不同角度进行扫描。就像侦探破案时从不同线索着手,多指针算法可以快速锁定目标,大幅缩小搜索范围。例如,在查找两个数组的交集中,我们只需用两个指针分别遍历这两个数组,比较元素并同步移动指针即可。

滑动窗口:局部扫描,窥见全貌

滑动窗口算法则类似于一扇不断移动的窗户,它在数组上滑动,每次只扫描窗口内的部分元素。这扇窗户的宽度由问题而定,它允许我们通过局部扫描推断出整个数组的信息。例如,在查找数组中长度为 k 的连续子数组的最大和时,我们只需要用一个宽度为 k 的滑动窗口,逐一滑动,就能找到答案。

LeetCode试炼:亲身体验算法的魅力

为了加深理解,不妨让我们在 LeetCode 上亲身体验多指针和滑动窗口算法的魅力。

练习 1:两数之和

给定一个数组和一个目标和,找出数组中两个元素之和等于目标和的索引。

多指针解法:

class Solution:
    def twoSum(self, nums: List[int], target: int) -> List[int]:
        left, right = 0, len(nums) - 1
        while left < right:
            sum = nums[left] + nums[right]
            if sum == target:
                return [left, right]
            elif sum < target:
                left += 1
            else:
                right -= 1

滑动窗口解法:

class Solution:
    def twoSum(self, nums: List[int], target: int) -> List[int]:
        left, window_sum = 0, 0
        for right in range(len(nums)):
            window_sum += nums[right]
            while window_sum >= target:
                if window_sum == target:
                    return [left, right]
                window_sum -= nums[left]
                left += 1

练习 2:连续子数组的最大和

给定一个数组,找出其中任意长度的连续子数组的最大和。

滑动窗口解法:

class Solution:
    def maxSubArray(self, nums: List[int]) -> int:
        max_sum, window_sum = -sys.maxsize, 0
        for num in nums:
            window_sum = max(window_sum + num, num)
            max_sum = max(window_sum, max_sum)
        return max_sum

结束语

多指针和滑动窗口算法展现了算法解决问题的多样性和高效性。通过不断练习和探索,我们能够深入理解这些算法的本质,并将它们应用于更复杂的问题中。在算法的王国里,还有许多未知的宝藏等待我们去发掘,让我们踏上探索的征程,领略算法的无穷魅力!