文章目录
总结
动态规划解决的子序列问题!
子序列问题的递推公式是在条件判断里的
一、300.最长递增子序列
- dp[i]:i之前包括i的以nums[i]结尾的最长递增子序列的长度
- 递推公式!
if(nums[i]>nums[j]){ dp[i] = Math.max(dp[i],dp[j]+1); }
:
位置i的最长升序子序列等于j从0到i-1各个位置的最长升序子序列 + 1 的最大值。
public int lengthOfLIS(int[] nums) {
int[] dp = new int[nums.length];//以nums[i]结尾的最大长度。
Arrays.fill(dp,1);
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 max = 0;
for(int i=0;i<dp.length;i++){
max = Math.max(max,dp[i]);
}
return max;
}
20分钟
二、674. 最长连续递增序列
- 这里判断条件只能是连续的两个之间。而不能是j从0-i循环遍历
- 记得初始化
public int findLengthOfLCIS(int[] nums) {
int[] dp = new int[nums.length];
Arrays.fill(dp,1);
for(int i=1;i<nums.length;i++){
if(nums[i]>nums[i-1]){
dp[i] = dp[i-1]+1;
}
}
int result = 0;
for(int i=0;i<dp.length;i++){
result = Math.max(result,dp[i]);
}
return result;
}
20分钟
三、718. 最长重复子数组
- 用二维数组来表示两个字符串的所有比较情况,以i-1,j-1为结尾
- 初始化第一行和第一列的数据。
public int findLength(int[] nums1, int[] nums2) {
int[][] dp = new int[nums1.length+1][nums2.length+1];
int max = 0;
for(int i=1;i<=nums1.length;i++){
for(int j=1;j<=nums2.length;j++){
// if(nums1[i]==nums2[j]){
// dp[i][j] = dp[i-1][j-1]+1;
// }
if(nums1[i-1]==nums2[j-1]){
dp[i][j] = dp[i-1][j-1]+1;
max = Math.max(max,dp[i][j]);
}
}
}
return max;
}
29分钟
下面的dp[i][j]表示以i和j为结尾的,上面的是以i-1,j-1结尾。
public int findLength(int[] nums1, int[] nums2) {
int[][] dp = new int[nums1.length][nums2.length];
int max = 0;
for(int i=0;i<nums1.length;i++){
if(nums1[i]==nums2[0]){
dp[i][0] = 1;
}
}
for(int j=0;j<nums2.length;j++){
if(nums1[0]==nums2[j]){
dp[0][j] = 1;
}
}
// for(int i=1;i<nums1.length;i++){
// for(int j=1;j<nums2.length;j++){
// // if(nums1[i]==nums2[j]){
// // dp[i][j] = dp[i-1][j-1]+1;
// // }
// if(nums1[i]==nums2[j]){
// dp[i][j] = dp[i-1][j-1]+1;
// }
// max = Math.max(max,dp[i][j]);
// }
// }
for(int i=0;i<nums1.length;i++){
for(int j=0;j<nums2.length;j++){
// if(nums1[i]==nums2[j]){
// dp[i][j] = dp[i-1][j-1]+1;
// }
if(i>0&&j>0&&nums1[i]==nums2[j]){
dp[i][j] = dp[i-1][j-1]+1;
}
max = Math.max(max,dp[i][j]);
}
}
return max;
}