返回

二分寻宝之旅:在套娃信封中探寻最长递增序列

后端

        
        
        

    **剖析题意:俄罗斯套娃信封的奥秘** 

    俄罗斯套娃信封问题仿佛一个谜团,引领我们探索信封的递增排列奥秘。题目给定 n 个套娃信封,每个信封由其宽度和高度定义。我们需要从中挑选一个最长递增序列,满足每个信封都严丝合缝地套在另一个信封内。

    **算法解析:二分法与动态规划的交融** 

    破解这个难题,我们引入二分法和动态规划两大法宝。二分法帮助我们快速找到每个信封最合适的插入位置,而动态规划则记录当前信封的最长递增子序列长度,为后续信封的插入提供依据。

    **具体步骤如下:** 

    1. 对信封按照宽度进行升序排序,确保宽度有序。

    2. 初始化动态规划数组 dp,其中 dp[i] 表示以第 i 个信封为结尾的最长递增序列长度。

    3. 遍历每个信封,利用二分法在 dp 数组中找到第一个大于或等于当前信封高度的元素索引 j4. 更新 dp[j] 的值为 max(dp[j], dp[i] + 1),其中 max 表示取两者中的较大值。

    5. 记录最长递增子序列的长度 maxLen。

    **代码实现:算法的完美体现** 

    清晰的代码实现,让算法的精妙之处跃然纸上:

    ```python
    def maxEnvelopes(envelopes):
        # 按宽度排序
        envelopes.sort(key=lambda x: x[0])

        # 初始化 dp 数组
        dp = [1] * len(envelopes)

        # 遍历信封
        for i in range(1, len(envelopes)):
            # 二分查找
            left, right = 0, i - 1
            while left <= right:
                mid = left + (right - left) // 2
                if envelopes[i][1] > envelopes[mid][1]:
                    left = mid + 1
                else:
                    right = mid - 1

            # 更新 dp[i]
            dp[i] = max(dp[i], dp[left] + 1)

        # 记录最长递增子序列长度
        maxLen = max(dp)

        return maxLen

    # 测试用例
    envelopes = [[5, 4], [6, 4], [6, 7], [2, 3]]
    print(maxEnvelopes(envelopes))  # 输出:3
    ```

    **结语:在算法的世界里遨游** 

    俄罗斯套娃信封问题是一道经典的算法难题,它考验着我们的思维能力和算法技巧。通过二分法和动态规划的巧妙结合,我们揭开了信封递增序列的奥秘。希望这篇博文能为算法爱好者带来启发,激发他们探索算法世界更多精彩角落的热情。