| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 数据结构与算法 -> LeetCode刷题笔记--动态规划 -> 正文阅读 |
|
[数据结构与算法]LeetCode刷题笔记--动态规划 |
目录 方法介绍动态规划(英语:Dynamic programming,简称 DP)是一种在数学、管理科学、计算机科学、经济学和生物信息学中使用的,通过把原问题分解为相对简单的子问题的方式求解复杂问题的方法。 动态规划不是某一种具体的算法,而是一种算法思想:若要解一个给定问题,我们需要解其不同部分(即子问题),再根据子问题的解以得出原问题的解。与分治法不同,其分解得到的子问题往往是相互联系的。 动态规划常常适用于有重叠子问题和最优子结构性质的问题,并且记录所有子问题的结果,因此动态规划方法所耗时间往往远少于朴素解法。 动态规划有自底向上和自顶向下两种解决问题的方式。 ①自顶向下即记忆化递归; ②自底向上就是递推。 使用动态规划解决的问题有个明显的特点,一旦一个子问题的求解得到结果,以后的计算过程就不会修改它,这样的特点叫做无后效性,求解问题的过程形成了一张有向无环图。动态规划只解决每个子问题一次,具有天然剪枝的功能,从而减少计算量。 动态规划算法适用于解最优化问题,其求解三大步骤: ①定义数组dp[i]中元素含义; ②找出数组元素之间的关系式; ③找出初始值; 练习题目1、53.最大子序组和题目(中等):给你一个整数数组? 子数组?是数组中的一个连续部分。 示例 1:输入:nums = [-2,1,-3,4,-1,2,1,-5,4]? 输出:6 解释:连续子数组?[4,-1,2,1] 的和最大,为?6 。 示例 2:输入:nums = [1]? 输出:1 求解: 关键理解: 我们?不知道和最大的连续子数组一定会选哪一个数,那么我们可以求出?所有?经过输入数组的某一个数的连续子数组的最大和。将问题分解为以下子问题: 子问题 1:以 -2?结尾的连续子数组的最大和是多少; ... 其中子问题1以 -2?结尾的连续子数组是 [-2],因此最大和就是 ?2。 子问题 2:以 11 结尾的连续子数组的最大和是多少; 如果编号为 i 的子问题的结果是负数或者 0 ,那么编号为 i + 1 的子问题就可以把编号为 i 的子问题的结果舍弃掉(这里 i 为整数,最小值为 1 ,最大值为 8),这是因为: 一个数 a 加上负数的结果比 a 更小; 复杂度分析 时间复杂度:O(n),其中 n?为nums 数组的长度。我们只需要遍历一遍数组即可求得答案。 代码1:
代码2:
2、124.二叉树的最大路径和题目(困难):路径被定义为一条从树中任意节点出发,沿父节点-子节点连接,达到任意节点的序列。同一个节点在一条路径序列中 至多出现一次 。该路径 至少包含一个 节点,且不一定经过根节点。 路径和 是路径中各节点值的总和。 给你一个二叉树的根节点 root ,返回其 最大路径和 。 示例 1:
?求解: 考虑实现一个简化的函数 maxGain(node),该函数计算二叉树中的一个节点的最大贡献值,具体而言,就是在以该节点为根节点的子树中寻找以该节点为起点的一条路径,使得该路径上的节点值之和最大。 具体而言,该函数的计算如下。 ·空节点的最大贡献值等于 0。 ·非空节点的最大贡献值等于节点值与其子节点中的最大贡献值之和(对于叶节点而言,最大贡献值等于节点值)。 例如: 叶节点 9、15、7?的最大贡献值分别为 9、15、7。 得到叶节点的最大贡献值之后,再计算非叶节点的最大贡献值。节点 20 的最大贡献值等于 20+max(15,7)=35,节点?10 的最大贡献值等于 -10+max(9,35)=25。 复杂度分析 时间复杂度:O(N),其中 N 是二叉树中的节点个数。对每个节点访问不超过 2 次。 空间复杂度:O(N),其中 N 是二叉树中的节点个数。空间复杂度主要取决于递归调用层数,最大层数等于二叉树的高度,最坏情况下,二叉树的高度等于二叉树中的节点个数。 代码:
3、300.最长上升子序列题目(中等):给你一个整数数组 nums ,找到其中最长严格递增子序列的长度。 子序列?是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如,[3,6,2,7] 是数组 [0,3,1,6,2,2,7] 的子序列。 示例 1: 输入:nums = [10,9,2,5,3,7,101,18] 输出:4 解释:最长递增子序列是 [2,3,7,101],因此长度为 4 。 示例 2: 输入:nums = [0,1,0,3,2,3] 输出:4 示例 3: 输入:nums = [7,7,7,7,7,7,7] 输出:1 求解: 本题与53.最大子序组和的思想类似,将问题分解为求以各数组元素结尾的最大子序和。具体如下: 状态定义:dp[i] 的值代表 nums 以 nums[i] 结尾的最长子序列长度。 1、当 nums[i] > nums[j] 时: nums[i] 可以接在nums[j] 之后(此题要求严格递增),此情况下最长上升子序列长度为 dp[j] + 1 ; 上述所有 1. 情况 下计算出的 dp[j]+1 的最大值,为直到 i 的最长上升子序列长度(即 dp[i] )。实现方式为遍历 j 时,每轮执行 dp[i] = max(dp[i], dp[j] + 1)。 复杂度分析: 代码:
总结利用动态规划解决相关最优化问题,其核心也是难点就是状态转移方程(描述子问题之间的联系)的建立,要在成分理解题意的基础上,将复杂问题分解成相互联系的子问题,找到子问题之间的联系并由此建立状态转移方程,最后根据条件确定初始值。 参考《力扣 动态规划》 https://leetcode.cn/tag/dynamic-programming/problemset/ |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/25 19:15:23- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |