300.最长递增子序列
代码随想录
- dp数组含义
- 以nums[i]结尾的最长递增子序列的长度
- 递推公式
- 位置 i 的最长升序子序列一定等于从 0 到 i -1 各个位置的最长升序子序列 + 1 的最大值
- if (nums[i] > nums[j]) dp[i] = Max(dp[i],dp[j]+1)
- 初始化
- dp都初始值为1
- 遍历顺序
- i 从前向后遍历 1 ~ n-1
- j 从前向后遍历 0 ~ i
class Solution {
public int lengthOfLIS(int[] nums) {
int[] dp = new int[nums.length];
Arrays.fill(dp,1);
int result = 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);
}
}
if (dp[i] > result) {
result = dp[i];
}
}
return result;
}
}
674.最长连续递增序列
只要连续就一直加,一旦连续就清零,用result记录最终大小
class Solution {
public int findLengthOfLCIS(int[] nums) {
int result = 1;
int increLength = 1;
for (int i = 1;i<nums.length;i++){
if(nums[i]>nums[i-1]){
increLength++;
}else{
increLength = 1;
}
result = Math.max(result,increLength);
}
return result;
}
}
718.最长重复子数组
代码随想录
- dp数组
- dp[i][j]: 以下标 i -1 为结尾的A,和以下标 j-1为结尾的B,最长重复子数组的长度为dp[i][j]
- 确定递推公式
- 当 A[i-1] == B[j-1] ,dp[i][j] = dp[i-1][j-1]+1;
- 初始化
- dp[i][0] = 0,dp[0][j] = 0
- 确定遍历顺序
- 从前往后,1~nums.length()+1
class Solution {
public int findLength(int[] nums1, int[] nums2) {
int[][] dp = new int[nums1.length+1][nums2.length+1];
int result = 0;
for (int i = 1; i <= nums1.length; i++) {
for (int j = 1; j <= nums2.length; j++) {
if (nums1[i - 1] == nums2[j - 1]) {
dp[i][j] = dp[i - 1][j - 1] + 1;
}
if (dp[i][j] > result) result = dp[i][j];
}
}
return result;
}
}