返回
二分寻宝之旅:在套娃信封中探寻最长递增序列
后端
2023-10-02 21:12:49
**剖析题意:俄罗斯套娃信封的奥秘**
俄罗斯套娃信封问题仿佛一个谜团,引领我们探索信封的递增排列奥秘。题目给定 n 个套娃信封,每个信封由其宽度和高度定义。我们需要从中挑选一个最长递增序列,满足每个信封都严丝合缝地套在另一个信封内。
**算法解析:二分法与动态规划的交融**
破解这个难题,我们引入二分法和动态规划两大法宝。二分法帮助我们快速找到每个信封最合适的插入位置,而动态规划则记录当前信封的最长递增子序列长度,为后续信封的插入提供依据。
**具体步骤如下:**
1. 对信封按照宽度进行升序排序,确保宽度有序。
2. 初始化动态规划数组 dp,其中 dp[i] 表示以第 i 个信封为结尾的最长递增序列长度。
3. 遍历每个信封,利用二分法在 dp 数组中找到第一个大于或等于当前信封高度的元素索引 j。
4. 更新 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
```
**结语:在算法的世界里遨游**
俄罗斯套娃信封问题是一道经典的算法难题,它考验着我们的思维能力和算法技巧。通过二分法和动态规划的巧妙结合,我们揭开了信封递增序列的奥秘。希望这篇博文能为算法爱好者带来启发,激发他们探索算法世界更多精彩角落的热情。