300
题目:
给你一个整数数组 nums
,找到其中最长严格递增子序列的长度。
子序列 是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如,[3,6,2,7]
是数组 [0,3,1,6,2,2,7]
的子序列。
题目链接:300. 最长递增子序列 - 力扣(LeetCode)
思路:
动态规划,理解dp[i]为以nums[i]为结尾的最长长度,然后遍历0到i-1来更新dp[i]。
代码:
Carl代码
class Solution {
public int lengthOfLIS(int[] nums) {
int[] dp = new int[nums.length];
int res = 1;
Arrays.fill(dp, 1);
for (int i = 1; i < dp.length; i++) {
for (int j = 0; j < i; j++) {
if (nums[i] > nums[j]) {
dp[i] = Math.max(dp[i], dp[j] + 1);
}
res = Math.max(res, dp[i]);
}
}
return res;
}
}
674
题目:
给定一个未经排序的整数数组,找到最长且 连续递增的子序列,并返回该序列的长度。
连续递增的子序列 可以由两个下标 l
和 r
(l < r
)确定,如果对于每个 l <= i < r
,都有 nums[i] < nums[i + 1]
,那么子序列 [nums[l], nums[l + 1], ..., nums[r - 1], nums[r]]
就是连续递增子序列。
题目链接:674. 最长连续递增序列 - 力扣(LeetCode)
思路:
动态规划,dp[i]为以nums[i]为结尾的最长长度,不同于上一题,这个必须是连续的,所以只需要比较前一元素,然后更新max。
代码:
class Solution {
public int findLengthOfLCIS(int[] nums) {
int max=1;
int [] dp =new int[nums.length];
Arrays.fill(dp,1);
for(int i=1;i<nums.length;i++)
{
if(nums[i]>nums[i-1]) dp[i]=dp[i-1]+1;
if(dp[i]>max) max=dp[i];
}
return max;
}
}
718
题目:
给两个整数数组 nums1
和 nums2
,返回 两个数组中 公共的 、长度最长的子数组的长度 。
题目链接:718. 最长重复子数组 - 力扣(LeetCode)
思路:
动态规划,两层for循环,dp[i][j]代表分别是各自对应结尾的长度。
代码:
class Solution {
public int findLength(int[] nums1, int[] nums2) {
int len1=nums1.length;
int len2=nums2.length;
int max=0;
int [][] dp = new int[len1][len2];
for(int i=0;i<len1;i++)
{
if(nums1[i]==nums2[0])
dp[i][0]=1;
}
for(int i=0;i<len2;i++)
{
if(nums1[0]==nums2[i])
dp[0][i]=1;
}
for(int i=0;i<len1;i++)
{
int max2=0;
for(int j=0;j<len2;j++)
{
if(nums1[i]==nums2[j] && i>0 && j>0)
dp[i][j]=dp[i-1][j-1]+1;
if(dp[i][j]>max)
max=dp[i][j];
}
}
return max;
}
}