← 返回博客列表
Apple

Apple 演算法面試:從暴力到優化的完整思路

2025-10-28

Apple 面試注重演算法優化過程。本文通過一道綜合題目,展示如何從暴力解法逐步優化到最優解,oavoservice 助你掌握優化思維。

📋 問題:陣列中的最長遞增子序列 (LIS)

給定陣列,找到最長嚴格遞增子序列的長度。

🎯 解法演進

方法一:暴力遞迴

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)

💼 oavoservice 助力

優化路徑 - 從暴力到最優的完整過程 複雜度分析 - 每一步的改進 面試技巧 - 如何展現思考過程

聯繫 oavoservice,專業演算法優化面試輔助!


標籤: #Apple #演算法優化 #動態規劃 #二分搜尋 #VO輔助 #面試輔助 #一畝三分地


需要面試真題? 立刻聯繫微信 Coding0201獲得真題