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