返回
前端算法之旅:多指针与滑动窗口的精彩世界
前端
2024-01-21 11:59:59
在算法世界的浩瀚星海中,多指针和滑动窗口算法以其独特而有趣的解题方式脱颖而出。这些算法往往出人意料,但却妙不可言,在解决某些问题时展现出惊人的效率。
多指针:指引方向,化繁为简
多指针算法的精髓在于利用多个指针,从数组的不同角度进行扫描。就像侦探破案时从不同线索着手,多指针算法可以快速锁定目标,大幅缩小搜索范围。例如,在查找两个数组的交集中,我们只需用两个指针分别遍历这两个数组,比较元素并同步移动指针即可。
滑动窗口:局部扫描,窥见全貌
滑动窗口算法则类似于一扇不断移动的窗户,它在数组上滑动,每次只扫描窗口内的部分元素。这扇窗户的宽度由问题而定,它允许我们通过局部扫描推断出整个数组的信息。例如,在查找数组中长度为 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
结束语
多指针和滑动窗口算法展现了算法解决问题的多样性和高效性。通过不断练习和探索,我们能够深入理解这些算法的本质,并将它们应用于更复杂的问题中。在算法的王国里,还有许多未知的宝藏等待我们去发掘,让我们踏上探索的征程,领略算法的无穷魅力!