目录
题目1: 最长递增子序列
- 题目链接:300. 最长递增子序列
1- 思路
动规五部曲
- 1. 确定 dp 数组含义
- dp[i] 代表以 numbers[i] 结尾的最长递增子序列的长度
- 2. 确定递推公式
- 如果
numbers[i]>numbers[j]
- 此时递推公式:
dp[i] = Math.max(dp[j]+1,dp[i])
- 如果
- 3. dp 数组初始化
- 默认都初始化为 1
- 4. 遍历顺序
i
从1
遍历到numbser.length
j
从0
遍历到i
- 5. 推导dp 数组
- 选取最大的值
2- 题解
⭐最长递增子序列——题解思路
class Solution {
public int lengthOfLIS(int[] nums) {
// 1. 定义dp数组
// 含义 以 nums[i] 结尾的最长递增子序列的长度
int[] dp = new int[nums.length];
// 2.递推公式
// if(nums[i]>nums[j]) dp[i] = Math.max(dp[i],dp[j]+1);
// 3. 初始化
Arrays.fill(dp,1);
// 4. 遍历顺序
for(int i = 1 ; i < nums.length;i++){
for(int j = 0 ; j < i ;j++){
if(nums[i]>nums[j]){
dp[i] = Math.max(dp[i],dp[j]+1);
}
}
}
int res = 1;
for(int i : dp){
res = Math.max(i,res);
}
return res;
}
}
题目2:674. 最长连续递增序列
- 题目链接:674. 最长连续递增序列
1- 思路
动规五部曲
- 1. 确定 dp 数组含义
dp[i]
代表以nums[i]
结尾的,最长连续递增子序列的长度
- 2. 确定递推公式
if(nums[i]>nums[i-1]) dp[i] = dp[i-1]+1;
- 3. dp 数组初始化
Arrays.fill(dp,1);
- 4. 遍历顺序
i
从1
遍历到nums.length
- 5. 推导dp 数组
2- 题解
⭐最长连续递增序列——题解思路
class Solution {
public int findLengthOfLCIS(int[] nums) {
// 1. 定义 dp
int[] dp = new int[nums.length];
// 2. 递推公式
// if(nums[i]>nums[i-1]) dp[i] = dp[i-1]+1;
// 3. 初始化
Arrays.fill(dp,1);
// 4. 遍历顺序
for(int i = 1 ; i < nums.length;i++){
if(nums[i]>nums[i-1]){
dp[i] = dp[i-1]+1;
}
}
int res = 1;
for(int i : dp){
res = Math.max(res,i);
}
return res;
}
}
题目3: 最长重复子数组
- 题目链接:718. 最长重复子数组
1- 思路
动规五部曲
- 1. 确定 dp 数组含义
- dp[i][j] 代表,以 i-1 为结尾的 nums1 和 以 j-1 为结尾的 nums2 数组的最长重复子数组的长度
**int[][] dp = new int[nums1.length+1][nums2.length+1];**
- 这样初始化时,不用关注 dp[0][j]、dp[i][0] 的初始化
- 2. 确定递推公式
- 如果两个数组元素相同
if(nums1[i-1] == nums2[j-1])
- 此时更新:
dp[i][j] = dp[i-1][j-1]+1
- 如果两个数组元素相同
- 3. dp 数组初始化
- dp 数组的第一行、第一列 没有实际意义,初始化为 0
- 4. 遍历顺序
i
从1
遍历到nums1.length
j
从1
遍历到nums2.length
- 5. 推导dp 数组
2- 题解
⭐最长重复子数组——题解思路
class Solution {
public int findLength(int[] nums1, int[] nums2) {
// 1. 定义 dp 数组
int[][] dp = new int[nums1.length+1][nums2.length+1];
// 2. 递推公式
// if(nums2[j]== nums1[i]) dp[i][j] = dp[i-1][j-1]+1
int res = 0;
for(int i = 1 ; i < nums1.length+1 ;i++){
for(int j = 1 ; j < nums2.length+1;j++){
if(nums2[j-1] == nums1[i-1]){
dp[i][j] = dp[i-1][j-1]+1;
}
res = Math.max(res,dp[i][j]);
}
}
return res;
}
}