← 返回博客列表
Apple

Apple 算法面试:从暴力到优化的完整思路

2025-10-28

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,获得真题