返回
大厂算法面试中递归&分治的妙用
前端
2023-12-19 03:39:04
互联网大厂面试中,算法题是必考题型,而递归和分治又是算法题中的重中之重。掌握了它们,你离大厂offer又近了一步。本文将带你深入浅出地理解递归和分治,助你轻松应对大厂算法面试。
在算法世界中,递归和分治就像两把利剑,可以帮你斩断复杂问题的藤蔓,直达问题的核心。
递归 ,顾名思义,就是函数自己调用自己。它是一种非常巧妙的解决问题的思路:将一个大问题拆分成若干个小问题,然后逐个解决这些小问题,最终得到大问题的解。
分治 ,也是一种分解问题的思想。它把一个大问题分成若干个独立的小问题,分别解决这些小问题,然后将小问题的解合并起来,得到大问题的解。
这两种算法思想看似相似,但又有着微妙的区别。递归更像是自上而下的解决问题,而分治更像是自下而上的解决问题。
为了加深你的理解,我们结合LeetCode算法题来实战演练一下递归和分治。
以LeetCode第10题「正则表达式匹配」为例,我们可以采用递归的思路来解决:
def isMatch(s, p):
if not p:
return not s
first_match = s and (p[0] == s[0] or p[0] == '.')
if len(p) >= 2 and p[1] == '*':
return isMatch(s, p[2:]) or (first_match and isMatch(s[1:], p))
return first_match and isMatch(s[1:], p[1:])
在这道题中,递归函数逐层拆分问题,直至找到匹配模式。这种自上而下的递归方式,很好地诠释了递归的精髓。
再来看看LeetCode第53题「最大子数组和」如何用分治解决:
def maxSubArray(nums):
def helper(nums, left, right):
if left == right:
return nums[left]
mid = (left + right) // 2
lmax = helper(nums, left, mid)
rmax = helper(nums, mid + 1, right)
sum = 0
for i in range(mid, left - 1, -1):
sum += nums[i]
lmax = max(lmax, sum)
sum = 0
for i in range(mid + 1, right + 1):
sum += nums[i]
rmax = max(rmax, sum)
return max(lmax, rmax, nums[mid] + lmax + rmax)
return helper(nums, 0, len(nums) - 1)
在分治算法中,问题被层层分解为更小的子问题,直到子问题足够小,可以轻松解决。然后,再将子问题的解合并起来,得到大问题的解。
掌握了递归和分治,你将如虎添翼,轻松应对大厂算法面试。祝你面试顺利,早日拿到心仪的offer!