本文主要是介绍代码随想录训练营二刷第五十六天 | 1143.最长公共子序列 1035.不相交的线 53. 最大子序和,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
代码随想录训练营二刷第五十六天 | 1143.最长公共子序列 1035.不相交的线 53. 最大子序和
一、1143.最长公共子序列
题目链接:https://leetcode.cn/problems/longest-common-subsequence/
思路:定义dp[i][j]表示在区间nums1[0, i-1]和nums2[0, j-1]区间中最长公共子序列长度,当nums1[i-1]==nums2[j-1]时,dp[i][j] = dp[i-1][j-1] + 1。当不等时,就各退一步,取最大值dp[i][j] = Math.max(dp[i-1][j], dp[i][j-1])。
如:a, b, c, d和 a, c。dp[4][2]就会从a,b,c,d和a中与a,b,c和a,c中取最长子数组。
class Solution {public int longestCommonSubsequence(String text1, String text2) {int[][] dp = new int[text1.length()+1][text2.length()+1];for (int i = 1; i <= text1.length(); i++) {for (int j = 1; j <= text2.length(); j++) {if (text1.charAt(i-1) == text2.charAt(j-1)) {dp[i][j] = dp[i-1][j-1] + 1;}else {dp[i][j] = Math.max(dp[i-1][j], dp[i][j-1]);}}}return dp[text1.length()][text2.length()];}
}
二、1035.不相交的线
题目链接:https://leetcode.cn/problems/uncrossed-lines/
思路:本题即为最长重复子数组和上题一模一样。
class Solution {public int maxUncrossedLines(int[] nums1, int[] nums2) {int[][] dp = new int[nums1.length+1][nums2.length+1];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;}else {dp[i][j] = Math.max(dp[i-1][j], dp[i][j-1]);}}}return dp[nums1.length][nums2.length];}
}
三、53. 最大子序和
题目链接:https://leetcode.cn/problems/maximum-subarray/
思路:定义dp[i]为以下标i结尾的区间的最大连续子序列和,那么dp[i]的状态从两个地方推出,一是,把当前元素作为上一个连续序列的结尾,二是,把当前元素作为一个新的连续序列的开始。二者取最大值。即dp[i] = Math.max(dp[i-1]+nums[i], nums[i])
class Solution {public int maxSubArray(int[] nums) {int[] dp = new int[nums.length];dp[0] = nums[0];int max = dp[0];for (int i = 1; i < nums.length; i++) {dp[i] = Math.max(dp[i-1]+nums[i], nums[i]);if (dp[i] > max) max = dp[i];}return max;}
}
这篇关于代码随想录训练营二刷第五十六天 | 1143.最长公共子序列 1035.不相交的线 53. 最大子序和的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!