代码随想录训练营第52天|300.最长递增子序列,674.最长连续递增子序列,718.最长重复子序列
- 300.最长递增子序列
- 文章
- 思路
- 代码
- 674.最长连续递增序列
- 文章
- 思路
- 代码
- 718.最长重复子数组
- 文章
- 思路
- 代码
- 总结
300.最长递增子序列
文章
代码随想录|0300.最长上升子序列
思路
d p [ i ] = M a x ( M a x n u m s [ i ] > n u m s [ j ] & & i > j ( d p [ j ] ) + 1 , 1 ) dp[i] = Max(Max_{nums[i]>nums[j]\&\&i >j}(dp[j]) + 1, 1) dp[i]=Max(Maxnums[i]>nums[j]&&i>j(dp[j])+1,1)
代码
class Solution {public int lengthOfLIS(int[] nums) {int i, j, n;int res = 1;n = nums.length;int[] dp = new int[n];for (i = 0; i < n; ++i) {dp[i] = 1;for (j = i - 1; j > -1; --j) {if (nums[i] > nums[j]) {dp[i] = Math.max(dp[i], dp[j] + 1);res = res > dp[i] ? res : dp[i];}}}return res;}
}
674.最长连续递增序列
文章
代码随想录|0674.最长连续递增序列
思路
反而比上一题简单,连续序列意味着不需要遍历i之前的所有位置
只需要0nums[i]>nums[i-1]即可令dp[i]=dp[i-1]+1
代码
class Solution {public int findLengthOfLCIS(int[] nums) {int i, n;n = nums.length;int[] dp = new int[n];dp[0] = 1;int res = 1;for (i = 1; i < n; ++i) {if (nums[i] > nums[i - 1]) {dp[i] = dp[i - 1] + 1;res = res > dp[i] ? res : dp[i];} else {dp[i] = 1;}}return res;}
}
718.最长重复子数组
文章
代码随想录|0718.最长重复子数组
思路
提示要用二维数组dp
dp[i][j]表示nums1的第i位为末尾的nums1的子数组和以nums2的第j位为末尾的nums2子数组中最长重复的长度,如果nums1[i]与nums2[j]相同则
d p [ i ] [ j ] = d p [ i − 1 ] [ j − 1 ] + 1 dp[i][j]=dp[i-1][j-1]+1 dp[i][j]=dp[i−1][j−1]+1
否则 d p [ i ] [ j ] = 0 dp[i][j]=0 dp[i][j]=0
代码
class Solution {public int findLength(int[] nums1, int[] nums2) {int res = 0;int i, j, m, n;m = nums1.length;n = nums2.length;int[][] dp = new int[m][n];// dp[0][0] = nums1[0] == nums2[0] ? 1 : 0;for (i = 0; i < m; ++i) {for (j = 0; j < n; ++j) {if (i > 0 && j > 0 && nums1[i] == nums2[j]) {dp[i][j] = dp[i - 1][j - 1] + 1;} else if (nums1[i] == nums2[j]) {dp[i][j] = 1;}res = res > dp[i][j] ? res : dp[i][j];}}return res;}
}
总结
基本上是N年前刷过的题,就像阔别已久的老友
欲买桂花同载酒!