Apple 面试注重算法优化过程。本文通过一道综合题目,展示如何从暴力解法逐步优化到最优解csvosupport* 助你掌握优化思维
📋 问题:数组中的最长递增子序
给定数组,找到最长严格递增子序列的长度
🎯 解法演进
方法一:暴力递归
def lengthOfLIS_v1(nums):
def dfs(i, prev):
if i == len(nums):
return 0
# 不选当前元
skip = dfs(i + 1, prev)
# 选择当前元素
take = 0
if prev == -1 or nums[i] > nums[prev]:
take = 1 + dfs(i + 1, i)
return max(skip, take)
return dfs(0, -1)
*时间 O(2^n)
方法二:记忆化搜
def lengthOfLIS_v2(nums):
memo = {}
def dfs(i, prev):
if i == len(nums):
return 0
if (i, prev) in memo:
return memo[(i, prev)]
skip = dfs(i + 1, prev)
take = 0
if prev == -1 or nums[i] > nums[prev]:
take = 1 + dfs(i + 1, i)
memo[(i, prev)] = max(skip, take)
return memo[(i, prev)]
return dfs(0, -1)
*时间 O(n²)
方法三:动态规
def lengthOfLIS_v3(nums):
if not nums:
return 0
dp = [1] * len(nums)
for i in range(1, len(nums)):
for j in range(i):
if nums[i] > nums[j]:
dp[i] = max(dp[i], dp[j] + 1)
return max(dp)
*时间 O(n²)
方法四:二分查找(最优)
def lengthOfLIS_v4(nums):
tails = []
for num in nums:
left, right = 0, len(tails)
while left < right:
mid = (left + right) // 2
if tails[mid] < num:
left = mid + 1
else:
right = mid
if left == len(tails):
tails.append(num)
else:
tails[left] = num
return len(tails)
*时间 O(n log n)
💼 csvosupport 助力
优化路径 - 从暴力到最优的完整过程 *复杂度分 - 每一步的改进 *面试技 - 如何展现思考过
联系 csvosupport,专业算法优化面试辅助!
*标签 #Apple #算法优化 #动态规#二分查找 #VO辅助 #面试辅助 #一亩三分地
需要面试真题? 立刻联系微信 Coding0201,获得真题。