当前位置:实例文章 » 其他实例» [文章]Day 52| 300.最长递增子序列 | 674. 最长连续递增序列 | 718. 最长重复子数组

Day 52| 300.最长递增子序列 | 674. 最长连续递增序列 | 718. 最长重复子数组

发布人:shili8 发布时间:2024-12-26 17:24 阅读次数:0

**Day52|300. 最长递增子序列 |674. 最长连续递增序列 |718. 最长重复子数组**

今天,我们将讨论三个相关的问题:最长递增子序列(Longest Increasing Subsequence, LIS)、最长连续递增序列和最长重复子数组。这些问题都涉及到找出一个序列中最长的递增或连续递增子序列。

###1. 最长递增子序列 (LIS)

给定一个整数数组 `nums`,要求找到其中最长的递增子序列的长度。例如,如果输入 `[10,9,2,5,3,7,101,18]`,输出应该是 `4`,因为最长递增子序列是 `[2,3,7,101]`。

#### 解决方案我们可以使用动态规划来解决这个问题。首先,我们需要定义一个长度为 `n` 的数组 `dp`,其中 `dp[i]` 表示 `nums[0..i-1]` 中最长递增子序列的长度。

def lengthOfLIS(nums):
 n = len(nums)
 dp = [1] * n for i in range(1, n):
 for j in range(i):
 if nums[i] > nums[j]:
 dp[i] = max(dp[i], dp[j] +1)
 return max(dp)


#### 时间复杂度时间复杂度为 O(n^2),因为我们需要遍历整个数组 `nums`。

###2. 最长连续递增序列给定一个整数数组 `nums`,要求找到其中最长的连续递增子序列的长度。例如,如果输入 `[1,9,3,10,4,20,2]`,输出应该是 `5`,因为最长连续递增子序列是 `[1,3,4,5,7]`。

#### 解决方案我们可以使用动态规划来解决这个问题。首先,我们需要定义一个长度为 `n` 的数组 `dp`,其中 `dp[i]` 表示 `nums[0..i-1]` 中最长连续递增子序列的长度。

def longestContinuousIncreasingSequence(nums):
 n = len(nums)
 dp = [1] * n for i in range(1, n):
 if nums[i] > nums[i -1]:
 dp[i] = dp[i -1] +1 return max(dp)


#### 时间复杂度时间复杂度为 O(n),因为我们只需要遍历整个数组 `nums`。

###3. 最长重复子数组给定两个整数数组 `nums1` 和 `nums2`,要求找到其中最长的重复子数组的长度。例如,如果输入 `[1,2,3]` 和 `[2,3,4]`,输出应该是 `2`,因为最长重复子数组是 `[2,3]`。

#### 解决方案我们可以使用动态规划来解决这个问题。首先,我们需要定义一个长度为 `n` 的数组 `dp`,其中 `dp[i]` 表示 `nums1[0..i-1]` 和 `nums2[0..i-1]` 中最长重复子数组的长度。

def findLength(nums1, nums2):
 n = len(nums1)
 m = len(nums2)
 dp = [[0] * (m +1) for _ in range(n +1)]
 for i in range(1, n +1):
 for j in range(1, m +1):
 if nums1[i -1] == nums2[j -1]:
 dp[i][j] = dp[i -1][j -1] +1 else:
 dp[i][j] = max(dp[i -1][j], dp[i][j -1])
 return max(max(row) for row in dp)


#### 时间复杂度时间复杂度为 O(n * m),因为我们需要遍历整个数组 `nums1` 和 `nums2`。

以上就是今天的内容。希望你能理解这些问题和解决方案,能够应用到实际的问题中去!

其他信息

其他资源

Top