300.最长递增子序列
**题目:**给你一个整数数组 nums ,找到其中最长严格递增子序列的长度。子序列 是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如,[3,6,2,7] 是数组 [0,3,1,6,2,2,7] 的子序列。
 
题目链接:300.最长递增子序列
 解题思路:
 dp数组的含义:以nums[i]结尾的最长递增子数组
 所以当该序列以nums[i] 结尾时,遍历nums的0至i-1
 当该数字nums[j]小于nums[i] 证明可以以nums[i] 结尾 此时dp[i]=dp[j]+1
 因为有多个满足条件的nums[j],取最大值
 递推公式为:
 dp[i]=Math.max(dp[i],dp[j]+1);
 最终的最大值不一定以nums[nums.length-1]结尾,所以需要维护一个int类型的max
 代码如下:
class Solution {
    public int lengthOfLIS(int[] nums) {
        if(nums.length==1){
            return 1;
        }
        //dp[n]含义 以nums[n-1]为结尾的严格递增子序列长度
        int n=nums.length;
        int[] dp=new int[n];
        dp[0]=1;
        Arrays.fill(dp, 1);
        int res = 0;
        for(int i=1;i<n;i++){
            //递推公式
            //遍历i前面的数确定是否加入数组
            for(int j=0;j<i;j++){
                if(nums[j]<nums[i]){
                    dp[i]=Math.max(dp[i],dp[j]+1);
                }
            }
            res = Math.max(res, dp[i]);
        }
        return res;            
    }
}
674. 最长连续递增序列
代码如下:
  public static int findLengthOfLCIS(int[] nums) {
        int[] dp = new int[nums.length];
        for (int i = 0; i < dp.length; i++) {
            dp[i] = 1;
        }
        int res = 1;
	//可以注意到,這邊的 i 是從 0 開始,所以會出現和卡哥的C++ code有差異的地方,在一些地方會看到有 i + 1 的偏移。
        for (int i = 0; i < nums.length - 1; i++) {
            if (nums[i + 1] > nums[i]) {
                dp[i + 1] = dp[i] + 1;
            }
            res = res > dp[i + 1] ? res : dp[i + 1];
        }
        return res;
    }
718. 最长重复子数组
题目:给两个整数数组 nums1 和 nums2 ,返回 两个数组中 公共的 、长度最长的子数组的长度 。
 示例 1:
 输入:nums1 = [1,2,3,2,1], nums2 = [3,2,1,4,7]
 输出:3
 解释:长度最长的公共子数组是 [3,2,1] 。
 示例 2:
 输入:nums1 = [0,0,0,0,0], nums2 = [0,0,0,0,0]
 输出:5
 题目链接: 718. 最长重复子数组
 解题思路:
 1.dp数组的含义 数组【0-nums[i-1]】与【0-nums[j-1]】的最长公共后缀
 2.递推公式 即当A[i - 1] 和B[j - 1]相等的时候,dp[i][j] = dp[i - 1][j - 1] + 1;
 3.为什么要记录最大值 因为要求的是最长数组的公共子序列,最长公共后缀不一定是最长公共数组产生的
 代码如下:
class Solution {
    public int findLength(int[] nums1, int[] nums2) {
        int result = 0;
        int[][] dp = new int[nums1.length + 1][nums2.length + 1];
        
        for (int i = 1; i < nums1.length + 1; i++) {
            for (int j = 1; j < nums2.length + 1; j++) {
                if (nums1[i - 1] == nums2[j - 1]) {
                    dp[i][j] = dp[i - 1][j - 1] + 1;
                    result = Math.max(result, dp[i][j]);
                }
            }
        }
        
        return result;
    }
}



















