300.最长递增子序列
今天开始正式子序列系列,本题是比较简单的,感受感受一下子序列题目的思路。
Python:
class Solution:
def lengthOfLIS(self, nums: List[int]) -> int:
n = len(nums)
if n==1: return 1
dp = [1]*n
result = 0
for i in range(1, n):
for j in range(i):
if nums[i]>nums[j]:
dp[i] = max(dp[i], dp[j]+1)
result = max(result, dp[i])
return result
C++:
class Solution {
public:
int lengthOfLIS(vector<int>& nums) {
int n = nums.size();
vector<int> dp(n, 1);
int result = 1;
for (int i=1; i<n; i++) {
for (int j=0; j<i; j++) {
if (nums[i]>nums[j]) dp[i] = max(dp[i], dp[j]+1);
}
result = max(result, dp[i]);
}
return result;
}
};
674. 最长连续递增序列
本题相对于昨天的动态规划:300.最长递增子序列 最大的区别在于“连续”。 先尝试自己做做,感受一下区别
视频讲解:动态规划之子序列问题,重点在于连续!| LeetCode:674.最长连续递增序列_哔哩哔哩_bilibili
Python:
class Solution:
def findLengthOfLCIS(self, nums: List[int]) -> int:
n = len(nums)
dp = [1]*n
result = 1
for i in range(1, n):
if nums[i]>nums[i-1]:
dp[i] = dp[i-1]+1
result = max(result, dp[i])
return result
C++:
class Solution {
public:
int findLengthOfLCIS(vector<int>& nums) {
vector<int> dp(nums.size(), 1);
int result = 1;
for (int i=1; i<nums.size(); i++) {
if (nums[i]>nums[i-1]) dp[i] = dp[i-1]+1;
result = max(result, dp[i]);
}
return result;
}
};
718. 最长重复子数组
稍有难度,要使用二维dp数组了
视频讲解:动态规划之子序列问题,想清楚DP数组的定义 | LeetCode:718.最长重复子数组_哔哩哔哩_bilibili
Python:
class Solution:
def findLength(self, nums1: List[int], nums2: List[int]) -> int:
n, m = len(nums1), len(nums2)
dp = [[0]*(m+1) for _ in range(n+1)]
result = 0
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
result = max(result, dp[i][j])
return result
C++:
class Solution {
public:
int findLength(vector<int>& nums1, vector<int>& nums2) {
vector<vector<int>> dp(nums1.size()+1, vector<int>(nums2.size()+1, 0));
int result = 0;
for (int i=1; i<=nums1.size(); i++) {
for (int j=1; j<=nums2.size(); j++) {
if (nums1[i-1]==nums2[j-1]) {
dp[i][j] = dp[i-1][j-1] + 1;
}
result = max(result, dp[i][j]);
}
}
return result;
}
};