Day52 题目
LeetCode300最长递增子序列
核心思想:dp数组存放目前为止最长子序列长度,因为是序列,所以要从找到比他小的前面所有的内容,找到最长的那个
class Solution {
public int lengthOfLIS(int[] nums) {
int[] dp = new int[nums.length+1];
dp[0] = 0;
int max = 0;
for(int i = 1 ; i < nums.length ; i ++){
for(int j = 0 ; j < i ; j ++){
if( nums[j] < nums[i]){
dp[i] = Math.max(dp[i],dp[j]+1);
}
}
max = Math.max(dp[i],max);
}
return max+1;
}
}
LeetCode674最长连续递增序列
核心思想:这个题目和上面题目的区别是这个要求是连续的,那么如果不是递增的就重置为0就行了
class Solution {
public int findLengthOfLCIS(int[] nums) {
int[] dp = new int[nums.length];
int max = 0;
for(int i = 1 ; i < nums.length ; i ++){
if(nums[i] > nums[i-1]){
dp[i] = dp[i-1]+ 1;
}else{
dp[i] = 0;
}
max = Math.max(dp[i],max);
}
return max+1;
}
}
LeetCode718最长重复连续子序列
核心思想:需要用到二维dp数组 dp[i][j]表示第一个数组的前i个元素和第二个数组的前j个元素的最长序列长度
class Solution {
public int findLength(int[] nums1, int[] nums2) {
// dp[i][j] 是 nums1 中前i个 nums2 中前j个字符之间的最长子数组长度
int[][] dp = new int[nums1.length+1][nums2.length+1];
int max = 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;
max = Math.max(dp[i][j],max);
}else{
// 因为是连续的,如果不同的话就得重置为0
dp[i][j] = 0;
}
}
}
return max;
}
}
1031

被折叠的 条评论
为什么被折叠?



