代碼隨想錄算法訓練營|第五十五天|1143.最长公共子序列、1035.不相交的线、53. 最大子序和。刷题心得(c++)

这篇具有很好参考价值的文章主要介绍了代碼隨想錄算法訓練營|第五十五天|1143.最长公共子序列、1035.不相交的线、53. 最大子序和。刷题心得(c++)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

讀題

1143.最长公共子序列

自己看到题目的第一想法

看完代码随想录之后的想法

1035.不相交的线

自己看到题目的第一想法

53. 最大子序和

看完代码随想录之后的想法

1143.最长公共子序列 - 實作

思路

Code

1035.不相交的线 - 實作

思路

Code

53. 最大子序和 - 實作

思路

Code

總結

自己实现过程中遇到哪些困难

今日收获,记录一下自己的学习时长

相關資料

1143.最长公共子序列

1035.不相交的线

53. 最大子序和


讀題

1143.最长公共子序列

自己看到题目的第一想法

看起來跟最長重複子数組很類似,但是要怎麼去推遞推的狀態沒有想法

看完代码随想录之后的想法

看完之後,大概釐清了整體想法,可以想成說,因為我們要考慮的是不連續的子序列,所以會分成兩種狀態,一個是不相同,不相同的話需要看之前的序列有沒有重複,之前包括兩個方面,縱向與橫向關係,要取最大的,因為這個緣故,在相同的時候,因為之前的數都考慮過縱向與橫向的關係,可以直接從左上角跟重複子序列一樣,求出該值。 至於初始化的部分,在定義下標時,i、j都設定為i - 1 或者說 1 ~ i ,讓後續的遞推公式以及初始化都可以比較簡便。

1035.不相交的线

自己看到题目的第一想法

看到這題,看到卡哥的提示,觀察過後其實就跟最長的公共子序列一樣,如果有一個子序列是共有的,那最長的公共子序列一定是可以連接最多不相交的線,整體的概念是一致的。

53. 最大子序和

看完代码随想录之后的想法

其實整體概念跟連續遞增子序有點像,改為將数組變動 dp[i - 1] + nums[i] 以及 nums[i]的差異,看完程式碼後理解上不會太過於困難。

1143.最长公共子序列 - 實作

思路

  1. 定義DP數組以及下標的含意

    dp[i][j] 代表 0~ i - 1 的text1 以及 0 ~ j - 1 的text2 最长公共子序列長度為dp[i][j]

  2. 遞推公式

    分成兩種狀態相同與不相同

    不相同的話需要看之前的序列有沒有重複,之前包括兩個方面,縱向與橫向關係,要取最大的

    dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]);

    相同的時候,因為之前的數都考慮過縱向與橫向的關係,可以直接從左上角跟重複子序列一樣

    dp[i][j] = dp[i - 1][j - 1] + 1;

  3. 根據遞推公式、題意以及定義,確定DP數組如何初始化

    最少為0,所以初始化為0

  4. 確定遍歷順序

    因為需要左上角的數據來進行遍歷,所以是由前往後。

Code

class Solution {
public:
    int longestCommonSubsequence(string text1, string text2) {
        vector<vector<int>> dp (text1.size() + 1, vector<int>(text2.size() + 1, 0));
        for(int i = 1; i < text1.size() + 1; i++) {
            for(int j = 1; j < text2.size() + 1; j++) {
                if(text1[i - 1] == text2[j - 1]) dp[i][j] = dp[i - 1][j - 1] + 1;
                else dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]);
            }
        }
        return dp[text1.size()][text2.size()];
    }
};

1035.不相交的线 - 實作

思路

  1. 定義DP數組以及下標的含意

    dp[i][j] 代表 0~ i - 1 的nums1 以及 0 ~ j - 1 的nums2 最长不相交的线為dp[i][j]

  2. 遞推公式

    分成兩種狀態相同與不相同

    不相同的話需要看之前的序列有沒有重複,之前包括兩個方面,縱向與橫向關係,要取最大的

    dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]);

    相同的時候,因為之前的數都考慮過縱向與橫向的關係,可以直接從左上角跟重複子序列一樣

    dp[i][j] = dp[i - 1][j - 1] + 1;

  3. 根據遞推公式、題意以及定義,確定DP數組如何初始化

    最少為0,所以初始化為0

  4. 確定遍歷順序

    因為需要左上角的數據來進行遍歷,所以是由前往後。

Code

class Solution {
public:
    int maxUncrossedLines(vector<int>& nums1, vector<int>& nums2) {
        vector<vector<int>> dp (nums1.size() + 1, vector<int>(nums2.size() + 1, 0));
        for(int i = 1; i < nums1.size() + 1; i++) {
            for(int j = 1; j < nums2.size() + 1; j++) {
                if(nums1[i - 1] == nums2[j - 1]) dp[i][j] = dp[i - 1][j - 1] + 1;
                else dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]);
            }
        }
        return dp[nums1.size()][nums2.size()];
    }
};

53. 最大子序和 - 實作

思路

  1. 定義DP數組以及下標的含意

    dp[i] 代表 i 之前包含i 的number[i] 結尾的最大子序和是多少

  2. 遞推公式

    當前的数加上前面的數比較大還是當前的數比較大,取大的。

    dp[i] = max(dp[i - 1] + nums[i], nums[i])

    if dp [i] > result 更新result

  3. 根據遞推公式、題意以及定義,確定DP數組如何初始化

    將數組初始化為最小值,以及result = nums[0]

  4. 確定遍歷順序

    0 到 i 因為需要前面的數據來進行遍歷,所以是由前往後。

Code

class Solution {
public:
    int maxSubArray(vector<int>& nums) {
        vector<int> dp (nums.size() + 1, INT_MIN);
        int result = nums[0];
        dp[0] = nums[0];
        for(int i = 1; i < nums.size(); i++ ) {
            dp[i] = max(dp[i - 1] + nums[i], nums[i]);
            if(dp[i] > result) result = dp[i];
        }
        return result;
    }
};

總結

自己实现过程中遇到哪些困难

一開始對於最長公共子序列不太了解,但看完講解後,其實就是在重複子序列的基礎上考慮橫向與縱向的關係,以及最大子序和整體很像最長連續子序列,只是思考上需要進行轉換﹐整體而言,今天題目主要是思路上需要做一些改變,不然很容易繞進去。

今日收获,记录一下自己的学习时长

今天大概學習了2hr,整體是很充實的,尤其理解最長公共子序列,在想法上接續到的二題不相交的線就會非常清晰。

相關資料

● 今日学习的文章链接和视频链接

1143.最长公共子序列

视频讲解:动态规划子序列问题经典题目 | LeetCode:1143.最长公共子序列_哔哩哔哩_bilibili

https://programmercarl.com/1143.最长公共子序列.html

1035.不相交的线

视频讲解:动态规划之子序列问题,换汤不换药 | LeetCode:1035.不相交的线_哔哩哔哩_bilibili

https://programmercarl.com/1035.不相交的线.html

53. 最大子序和

视频讲解:看起来复杂,其实是简单动态规划 | LeetCode:53.最大子序和_哔哩哔哩_bilibili

https://programmercarl.com/0053.最大子序和(动态规划).html文章来源地址https://www.toymoban.com/news/detail-734782.html

到了这里,关于代碼隨想錄算法訓練營|第五十五天|1143.最长公共子序列、1035.不相交的线、53. 最大子序和。刷题心得(c++)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 算法训练第五十七天

    516. 最长回文子序列 - 力扣(LeetCode) 代码: 647. 回文子串 - 力扣(LeetCode)

    2024年02月09日
    浏览(45)
  • 第五十五天

        CSS3 ●背景 CSS3 中包含几个新的背景属性,提供更大背景元素控制: •background-image:添加背景图片。不同的背景图像和图像用逗号隔开,所有的图片中显示在最顶端的为第一张。 •background-size:指定背景图像的大小。CSS3以前,背景图像大小由图像的实际大小决定。  

    2024年02月12日
    浏览(38)
  • sqlilabs第五十九六十关

    手工注入 报错注入 手工注入

    2024年01月18日
    浏览(40)
  • 第五十九回: Slider Widget

    我们在上一章回中介绍了Form Widget相关的内容,本章回中将介绍 Slider Widget.闲话休提,让我们一起Talk Flutter吧。 我们在这里说的 Slider Widget是一种滑动条组件,通过滑动来控制不同的进度,它类似进度条,不过需要我们让去去滑动它的是进度,在实际项目中经常用它来调节音

    2024年02月09日
    浏览(42)
  • 第五十五回:命名路由(Route)

    我们在上一章回中介绍了BoxDecoration Widget相关的内容,本章回中将介绍命名路由(Route).闲话休提,让我们一起Talk Flutter吧。 我们在这里介绍的命名路由是路由(Route)中的一种,主要用来当作导航,通过导航跳转到不同的页面,它和我们前面章回中介绍的路由类似,只不过是给路由

    2024年02月09日
    浏览(61)
  • 第五十六章 Unity 音频播放

    Unity可以导入大多数标准音频文件格式,精通于在3D 空间中播放声音,还可根据需要提供其他效果。虽然播放声音是一件非常简单的事情,但是为了模拟现实直接中的各种声音效果,Unity会提供各种各样的组件来实现。 首先,我们需要了解“多普勒效应”。他是一名奥地物理

    2024年02月07日
    浏览(38)
  • 代码随想录第五十九天

    题目链接 : 下一个更大元素 II 自己的思路 :没想到哈哈哈哈!! 正确思路 :这个题在单调栈的情况下转了一个弯,就是需要取一个模操作,用来模拟一个数组的循环过程!!!! 代码 : 题目链接 : 接雨水 自己的思路 :想不到!!!! 正确思路 :利用单调栈来存储之前遍历的值

    2024年02月11日
    浏览(50)
  • 第五十三章 Unity 移动平台输入(上)

    在移动设备上,Input 类提供对触摸屏、加速度计和地理/位置输入的访问。这里我们简单介绍Input类对于触摸屏的支持。Input.Touches是一个触摸数组,每个数组元素代表着手指在屏幕上的触碰状态Input.Touch。Input.Touch 数据结构表示: fingerId 触摸索引 deltatime 从最后状态到当前状态

    2024年02月03日
    浏览(35)
  • 代码随想录-刷题第五十六天

    先介绍单调栈类型的题目, 通常是一维数组,要寻找任一个元素的右边或者左边第一个比自己大或者小的元素的位置,此时就要想到可以用单调栈 。时间复杂度为O(n)。 单调栈的本质是空间换时间,因为在遍历的过程中需要用一个栈来记录右边第一个比当前元素高的元素,优

    2024年01月17日
    浏览(38)
  • 第五十九章 Unity 发布Android平台

    本章节我们讲解如何打包发布到安卓手机平台。要为 Android 构建和运行应用程序,必须安装 Unity Android Build Support 平台模块。还需要安装 Android 软件开发工具包(SDK)和原生开发工具包(NDK)才能在 Android 设备上构建和运行代码。默认情况下,Unity 会安装基于 OpenJDK 的 Java 开

    2024年02月14日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包