代码随想录算法训练营第五十二天|LeetCode300.最大递增子序列、LeetCode674.最长连续递增子序列、LeetCode718.最长重复子数组

LeetCode 300 最大递增子序列

题目链接:300. 最长递增子序列 - 力扣(LeetCode)

【解题思路】

  • 1.确定dp数组含义

    • dp[i]表示的是i之前以nums[i]为结尾的最长递增子序列的长度

  • 2.确定递推公式

    • 如果nums[i]>nums[j]

      • max(dp[j]+1,dp[i])

  • 3.初始化dp数组

    • 每一个i,对应的dp[i](最长递增子序列)初始大小至少都是1

  • 4.确定遍历顺序

    • dp[i]是由0到i-1各个位置的最长递增子序列推导出来的,所以i一定是从前向后遍历

    • j就是遍历0到i-1,所以从前到后或者从后向前都无所谓,只要把0到i-1的元素都遍历了就行了

  • 5.举例推导dp数组

【解题步骤】

  • 1.创建一个dp数组,长度等于nums的长度

  • 2.定义一个result变量,初始化为1

  • 3.将dp数组内的所有元素全部初始化为1

  • 4.从前向后,从1开始遍历数组长度

    • 遍历0到i-1

      • 递推公式

    • 将当前result与dp[i]比较,选大的那个

  • 5.返回result

【代码部分】

class Solution {
    public int lengthOfLIS(int[] nums) {
		int[] dp = new int[nums.length];
		int result = 1;
		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[j]+1,dp[i]);
				}
			}
			result = Math.max(result,dp[i]);
		}
		return result;
    }
}

LeetCode 674 最长连续递增子序列

题目链接:674. 最长连续递增序列 - 力扣(LeetCode)

【解题思路】

  • 1.确定dp数组含义

    • dp[i]表示的是以下标i为结尾的连续递增的子序列长度为dp[i]

  • 2.确定递推公式

    • 如果nums[i]>nums[i-1]

      • dp[i] = dp[i-1]+1

  • 3.初始化dp数组

    • 每一个i,对应的dp[i](最长递增子序列)初始大小至少都是1

  • 4.确定遍历顺序

    • dp[i]是依赖dp[i-1]推出来的,所以一定是从前向后遍历

  • 5.举例推导dp数组

【解题步骤】

  • 1.创建一个dp数组,长度等于nums的长度

  • 2.定义一个result变量,初始化为1

  • 3.将dp数组内的所有元素全部初始化为1

  • 4.从前向后,从1开始遍历数组长度

    • 如果nums[i] > nums[i-1]

      • 递推公式

    • result和当前dp[i]比较,取最大的

  • 5.返回result

【代码部分】

class Solution {
    public int findLengthOfLCIS(int[] nums) {
		int[] dp = new int[nums.length];
		Arrays.fill(dp,1);
		int result = 1;
		for (int i = 1; i < nums.length; i++) {
			if(nums[i]>nums[i-1]){
				dp[i] = dp[i-1]+1;
			}
			result = Math.max(result,dp[i]);
		}
		return result;
    }
}

LeetCode 718 最长重复子数组

题目链接:718. 最长重复子数组 - 力扣(LeetCode)

【解题思路】

  • 1.确定dp数组含义

    • dp[i][j] :以下标i - 1为结尾的A,和以下标j - 1为结尾的B,最长重复子数组长度为dp[i][j]。

  • 2.确定递推公式

    • 当A[i - 1] 和B[j - 1]相等的时候

      • dp[i][j] = dp[i - 1][j - 1] + 1

  • 3.初始化dp数组

    • 每一个i,对应的dp[i](最长递增子序列)初始大小至少都是1

  • 4.确定遍历顺序

    • 先遍历A

      • 再遍历B

        • 递推公式

        • 其实先遍历A还是B都行

  • 5.举例推导dp数组

【解题步骤】

  • 1.创建一个dp数组,长度等于nums1的长度+1和nums2的长度+1

  • 2.定义一个result变量,初始化为1

  • 3.将dp数组内的所有元素全部初始化为1

  • 4.先遍历A

    • 再遍历B

      • 如果nums1[i-1] == nums2[j-1]

        • 递推公式

        • result和dp[i][j]比,选最大的

  • 5.返回result

【代码部分】

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;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值