class Solution {
public int lengthOfLIS(int[] nums) {
if(nums.length == 1) return 1;
int[] dp = new int[nums.length];
int res = 0;
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);//比较nums[i] nums[j]的大小,若大于,dp[j]+1和dp[i]取大值
}
res = Math.max(res, dp[i]);//取所有dp[i]的最大值
}
return res;
}
}
class Solution {
public int findLengthOfLCIS(int[] nums) {
int[] dp = new int[nums.length];
int res = 1;
Arrays.fill(dp,1);
for(int i = 1; i < nums.length; i++) {
if(nums[i] > nums[i-1]) dp[i] = dp[i-1] + 1;
res = Math.max(dp[i], res);
}
return res;
}
}
class Solution {
public int findLength(int[] nums1, int[] nums2) {
int[][] dp = new int[nums1.length+1][nums2.length+1];//以下标i - 1为结尾的nums1,和以下标j - 1为结尾的nums2,最长重复子数组长度为dp[i][j]。
int res = 0;
for(int i = 1; i <= nums1.length; i++) {//不从0开始遍历是防止出现边界问题
for(int j = 1; j <= nums2.length; j++) {
if(nums1[i-1] == nums2[j-1]) {
dp[i][j] = dp[i-1][j-1] + 1;//dp[i-1][j-1]是因为要同时比较邻近的两个数
res = Math.max(res, dp[i][j]);
}
}
}
return res;
}
}
class Solution {
public int findLength(int[] nums1, int[] nums2) {
int[] dp = new int[nums2.length+1];//以下标i - 1为结尾的nums1,和以下标j - 1为结尾的nums2,最长重复子数组长度为dp[i][j]。
int res = 0;
for(int i = 1; i <= nums1.length; i++) {//不从0开始遍历是防止出现边界问题
for(int j = nums2.length; j > 0; j--) {//防止出现覆盖情况,若正序遍历,dp[j-1]会覆盖掉i-1对应的dp[j-1]
if(nums1[i-1] == nums2[j-1]) {
dp[j] = dp[j-1] + 1;//dp[j-1]是因为要同时比较邻近的两个数
} else {
dp[j] = 0;
}
res = Math.max(res, dp[j]);
}
}
return res;
}
}