LeetCode(字节 10 日完结)-0718
发布人:shili8
发布时间:2025-01-31 09:18
阅读次数:0
**LeetCode(字节10 日完结)-0718**
### **前言**
本文是 LeetCode 的第71 天,主题为 "字节10 日完结"。在这篇文章中,我们将讨论如何解决一道经典的算法题目,并提供详细的代码示例和注释。
### **问题描述**
**0718. 最长连续子序列**
给定一个整数数组 `nums`,请找出其中最长连续子序列(LCS)的长度。子序列是指从原始序列中删除一些元素而不改变其相对顺序的序列。
示例1:
* 输入:`nums = [1,9,3,10,4,20,2]`
* 输出:`5`
示例2:
* 输入:`nums = [1,2,3,4,5,6,7,8,9]`
* 输出:`9`
### **解决方案**
我们可以使用动态规划来解决这个问题。具体来说,我们将维护一个长度为 `n` 的数组 `dp`,其中 `dp[i]` 表示从第0 个元素到第 `i` 个元素的最长连续子序列的长度。
class Solution: def longestContinuousSubsequence(self, nums: List[int]) -> int: n = len(nums) dp = [1] * n for i in range(1, n): if nums[i] - nums[i-1] ==1: dp[i] = dp[i-1] +1 return max(dp)
### **代码注释**
* 我们首先初始化一个长度为 `n` 的数组 `dp`,其中每个元素都等于1。这是因为每个数字都是自身的连续子序列。
* 然后,我们遍历从第1 个元素到第 `n-1` 个元素的所有数字。如果当前数字与前一个数字相差1,则我们更新 `dp[i]` 为 `dp[i-1] +1`。这意味着我们找到了一个长度为 `dp[i-1] +1` 的连续子序列。
* 最后,我们返回 `dp` 中的最大值,这代表了最长连续子序列的长度。
### **时间复杂度**
时间复杂度为 O(n),其中 n 是数组 `nums` 的长度。我们只遍历了一次数组,因此时间复杂度是线性的。
### **空间复杂度**
空间复杂度为 O(n),其中 n 是数组 `nums` 的长度。我们维护了一个长度为 n 的数组 `dp`,因此空间复杂度也是线性的。
### **总结**
在本文中,我们讨论了如何使用动态规划来解决 LeetCode 的第71 天题目 "字节10 日完结"。我们提供了详细的代码示例和注释,并分析了时间和空间复杂度。