首页 > 编程语言 >代码随想录算法训练营 | 1143.最长公共子序列,1035.不相交的线,53. 最大子序和,392.判断子序列

代码随想录算法训练营 | 1143.最长公共子序列,1035.不相交的线,53. 最大子序和,392.判断子序列

时间:2024-10-17 21:14:38浏览次数:7  
标签:1143 nums int 随想录 length 序列 dp

1143.最长公共子序列
题目链接:1143.最长公共子序列
文档讲解︰代码随想录(programmercarl.com)
视频讲解︰最长公共子序列
日期:2024-10-17

想法:这里的子序列不要求连续了,dp[i][j]要表示为在text1[0, i - 1]和text2[0, j - 1]的范围里,最长的公共子序列长度,-1同样是为了初始化方便,如果text1[i - 1], text2[j - 1]相等,直接在前一个状态dp[i - 1][j - 1]加1就行,不等的话,就要看是text1减一个长度时的最长公共子序列长还是text2的,即dp[i - 1][j], dp[i][j - 1];
Java代码如下:

class Solution {
    public int longestCommonSubsequence(String text1, String text2) {
        char[] char1 = text1.toCharArray();
        char[] char2 = text2.toCharArray();

        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(char1[i - 1] == char2[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.不相交的线
题目链接:1035.不相交的线
文档讲解︰代码随想录(programmercarl.com)
视频讲解︰不相交的线
日期:2024-10-17

想法:跟上面思路一摸一样。
Java代码如下:

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. 最大子序和
题目链接:53. 最大子序和
文档讲解︰代码随想录(programmercarl.com)
视频讲解︰最大子序和
日期:2024-10-17

想法:关键在于递推公式dp[i] = Math.max(dp[i - 1] + nums[i], nums[i]),本质跟贪心思路一样,dp[i - 1]为负就dp[i]重置为nums[i]
Java代码如下:

class Solution {
    public int maxSubArray(int[] nums) {
        int[] dp = new int[nums.length];
        dp[0] = nums[0];
        int res = nums[0];
        for(int i = 1; i < nums.length; i++) {
            dp[i] = Math.max(dp[i - 1] + nums[i], nums[i]);
            res = Math.max(res, dp[i]);
        }
        return res;
    }
}

392.判断子序列
题目链接:392.判断子序列
文档讲解︰代码随想录(programmercarl.com)
视频讲解︰判断子序列
日期:2024-10-17

想法:跟最长公共子序列的区别在于,字串s必须全部是t的字串,所以当s1[i - 1] != t1[j - 1]时s并不能呢再回去了即dp[i - 1][j]是不能要的。最后加个判断条件。
Java代码如下:

class Solution {
    public boolean isSubsequence(String s, String t) {
        if(s.length() > t.length()) return false;
        char[] s1 = s.toCharArray();
        char[] t1 = t.toCharArray();
        int[][] dp = new int[s.length() + 1][t.length() + 1];
        for(int i = 1; i <= s.length(); i++) {
            for(int j = 1; j <= t.length(); j++) {
                if(s1[i - 1] == t1[j - 1]) dp[i][j] = dp[i - 1][j - 1] + 1;
                else dp[i][j] = dp[i][j - 1];
            }
        }
        if(dp[s.length()][t.length()] == s.length()) return true;
        return false;
    }
}

标签:1143,nums,int,随想录,length,序列,dp
From: https://www.cnblogs.com/wowoioo/p/18473081

相关文章

  • 代码随想录算法训练营第二天|209长度最小的子数组、59螺旋矩阵
    1leetcode209长度最小的子数组题目链接:209.长度最小的子数组文章链接:代码随想录(programmercarl.com)视频链接:拿下滑动窗口!|LeetCode209长度最小的子数组思路:没有思路,看到这道题有一种想立马退出的感觉,无从下手1.1暴力搜索1.1.1python版本这个版本的新知识就是定义......
  • 时间序列预测(八)——过拟合、欠拟合、正则化
    在介绍正则化之前,先介绍几个概念:1.过拟合(Overfitting)过拟合是指模型在训练集上表现得非常好,但在测试集上表现不佳。这通常是因为模型学习到了训练数据中的噪声和不必要的细节,导致模型在新数据上的泛化能力下降。主要表现:训练误差低,但测试误差高。预测结果对训练数据的微......
  • 代码随想录|二叉树part 03
    求普通二叉树的节点数量要点:将子节点的个数记录到父节点,使用后序遍历classSolution{public:intmaxDepth(TreeNode*root){if(root==NULL)return0;intleft1=maxDepth(root->left);intright1=maxDepth(root->right);intnum=......
  • 代码随想录|二叉树part 02
    翻转二叉树要点:指针交换优先利用前序或后序遍历,若采用中序遍历(则两次采用遍历左子树)classSolution{public:TreeNode*invertTree(TreeNode*root){if(root==NULL)returnroot;swap(root->left,root->right);invertTree(root->left);......
  • 代码随想录算法训练营 | 300.最长递增子序列,674. 最长连续递增序列,718. 最长重复子数
    300.最长递增子序列题目链接:300.最长递增子序列文档讲解︰代码随想录(programmercarl.com)视频讲解︰最长递增子序列日期:2024-10-16想法:dp[i]表示以nums[i]结尾的最长子数列长度,需要知道i之前的j的dp[j],找到最大的dp[j],再加1,初始化都为1。Java代码如下:classSolution{pub......
  • 计量经济学(七)——时间序列GARCH模型
    金融市场中的波动性建模是金融计量经济学的重要研究内容。时间序列数据,尤其是金融市场数据,往往表现出强烈的波动聚集现象,这意味着波动率在某些时期较高,而在其他时期较低,波动性具有异方差性(heteroskedasticity)。为了有效描述这种现象,Engle(1982年)提出了ARCH(自回归条件异方差)模型,此......
  • 代码随想录训练营第64天|bellman_ford
    47.参加科学大会#include<iostream>#include<vector>#include<list>#include<queue>#include<climits>usingnamespacestd;//小顶堆classmycomparison{public:booloperator()(constpair<int,int>&lhs,constpai......
  • 代码随想录训练营第58天|统计相邻
    110.字符串接龙#include<iostream>#include<vector>#include<string>#include<unordered_set>#include<unordered_map>#include<queue>usingnamespacestd;intmain(){stringbeginStr,endStr,str;intn;ci......
  • 代码随想录算法训练营day17| 654.最大二叉树 617.合并二叉树 700.二叉搜索树中的搜
    学习资料:https://programmercarl.com/0654.最大二叉树.html#算法公开课用前序遍历构造二叉树二叉搜索树的特点,其左节点的值<每个节点的值<其右节点的值,且根节点的值大于它的左子树的所有节点的值,小于它右子树的所有节点的值,其他同理。二叉搜索树的搜索和验证时不关心遍历顺序,因......
  • 【bayes-Transformer多维时序预测】bayes-Transformer多变量时间序列预测,基于bayes-Tr
    %% 划分训练集和测试集P_train=res(1:num_train_s,1:f_)';T_train=res(1:num_train_s,f_+1:end)';P_test=res(num_train_s+1:end,1:f_)';T_test=res(num_train_s+1:end,f_+1:end)';%% 划分训练集和测试集M=size(P_train,2);N=siz......