【代码随想录】【算法训练营】【第39天】 [62]不同路径 [63]不同路径II [343]整数拆分 [96]不同的二叉搜索树

前言

思路及算法思维,指路 代码随想录。
题目来自 LeetCode。

day 39,周六,坚持不住了~

题目详情

[62] 不同路径

题目描述

62 不同路径
62 不同路径

解题思路

前提:每次只能向下或者向右移动一步
思路:动态规划, dp[i][j]: 到达(i, j)位置的路径数量, dp[i][j] = dp[i-1][j] + dp[i][j-1] 。
重点:dp数组的定义,以及 推导公式。

代码实现

C语言
动态规划dp[i][j]

动态规划 dp[i][j]: 到达(i, j)位置的路径数量, dp[i][j] = dp[i-1][j] + dp[i][j-1];

// dp[i][j]: 到达(i, j)位置的路径数量, dp[i][j] = dp[i-1][j] + dp[i][j-1];
int uniquePaths(int m, int n) {int dp[m][n];// 动态数组初始化for (int i = 0; i < m; i++) {dp[i][0] = 1;}for (int j = 0; j < n; j++) {dp[0][j] = 1;}// 从前到后,遍历其余位置for (int i = 1; i < m; i++) {for (int j = 1; j < n; j++) {dp[i][j] = dp[i - 1][j] + dp[i][j - 1];}}return dp[m - 1][n - 1];
}
动态规划dp[i]

动态规划 dp[i][j]压缩空间为dp[i], dp[i] = dp[i] + dp[i-1]

// dp[i][j]: 到达(i, j)位置的路径数量, dp[i][j] = dp[i-1][j] + dp[i][j-1];
// 压缩空间为dp[i], dp[i] = dp[i] + dp[i-1]
int uniquePaths(int m, int n) {int dp[n];// 动态数组初始化for (int j = 0; j < n; j++) {dp[j] = 1;}// 从前到后,按行更新数组for (int i = 1; i < m; i++) {for (int j = 1; j < n; j++) {dp[j] = dp[j - 1] + dp[j];}}return dp[n - 1];
}

[63] 不同路径II

题目描述

63 不同路径II
63 不同路径II

解题思路

前提:每次只能向下或者向右移动一步,且可能有障碍
思路:动态规划:d[i][j]: 到达(i, j)位置的路径数量, dp[i][j] = dp[i-1][j] + dp[i][j-1] 。
重点:dp数组的定义,以及 推导公式。

代码实现

C语言
动态规划dp[i][j]

动态规划:d[i][j]: 到达(i, j)位置的路径数量, dp[i][j] = dp[i-1][j] + dp[i][j-1]

// d[i][j]: 到达(i, j)位置的路径数量, dp[i][j] = dp[i-1][j] + dp[i][j-1]
int uniquePathsWithObstacles(int** obstacleGrid, int obstacleGridSize, int* obstacleGridColSize) {//定义dp数组int dp[obstacleGridSize][*obstacleGridColSize];//初始化dp数组int found = false;for (int i = 0; i < obstacleGridSize; i++) {if ((found != true) && (obstacleGrid[i][0] != 1)) {dp[i][0] = 1;} else {found = true;dp[i][0] = 0;}}found = false;for (int j = 0; j < *obstacleGridColSize; j++) {if ((found != true) && (obstacleGrid[0][j] != 1)) {dp[0][j] = 1;} else {found = true;dp[0][j] = 0;}}// 从上到下,从左到右,遍历for (int i = 1; i < obstacleGridSize; i++) {for (int j = 1; j < *obstacleGridColSize; j++) {// 判断是否为障碍if (obstacleGrid[i][j] != 1) {dp[i][j] = dp[i - 1][j] + dp[i][j - 1];} else {dp[i][j] = 0;}} }return dp[obstacleGridSize - 1][*obstacleGridColSize - 1];
}
动态规划dp[i]

d[i][j]压缩为d[i], dp[i] = dp[i-1] + dp[i]

// d[i][j]: 到达(i, j)位置的路径数量, dp[i][j] = dp[i-1][j] + dp[i][j-1]
// 压缩为d[i], dp[i] = dp[i-1] + dp[i]
int uniquePathsWithObstacles(int** obstacleGrid, int obstacleGridSize, int* obstacleGridColSize) {//定义dp数组int dp[*obstacleGridColSize];//初始化dp数组int found = false;for (int j = 0; j < *obstacleGridColSize; j++) {if ((found != true) && (obstacleGrid[0][j] != 1)) {dp[j] = 1;} else {found = true;dp[j] = 0;}}// 从上到下,从左到右,遍历for (int i = 1; i < obstacleGridSize; i++) {for (int j = 0; j < *obstacleGridColSize; j++) {// 判断是否为障碍if (obstacleGrid[i][j] == 1) {dp[j] = 0;} else if (j > 0) {dp[j] = dp[j - 1] + dp[j];}} }return dp[*obstacleGridColSize - 1];
}

[343] 整数拆分

题目描述

343 整数拆分
343 整数拆分

解题思路

前提:拆分为 k 个 正整数 的和( k >= 2 )
思路:动态规划, dp[i]: i的最大乘积, 拆分为两数或者多数之积, d[i] = max(j*(i-j), jdp[i-j]); 遍历j时, 取各个dp[i]的最大值, 故dp[i] = max(dp[i], j(i-j), j*dp[i-j])。
重点:dp数组的定义,以及 推导公式。

代码实现

C语言
动态规划
// dp[i]: i的最大乘积, 拆分为两数或者多数之积, d[i] = max(j*(i-j), j*dp[i-j])
// 遍历j时, 取各个dp[i]的最大值
// 故dp[i] = max(dp[i], j*(i-j), j*dp[i-j])int max(int p1, int p2)
{return p1 > p2 ? p1 : p2;
}int integerBreak(int n) {// 定义dp数组int dp[n + 1];// 初始化for (int i = 0; i < (n + 1); i++) {dp[i] = 0;}dp[1] = 1;// 从小到大遍历整数for (int i = 2; i <= n; i++) {for (int j = 1; j < i; j++) {dp[i] = max(dp[i], max((j * dp[i - j]), j * (i - j)));}}return dp[n];
}
动态规划 优化遍历
// dp[i]: i的最大乘积, 拆分为两数或者多数之积, d[i] = max(j*(i-j), j*dp[i-j])
// 遍历j时, 取各个dp[i]的最大值
// 故dp[i] = max(dp[i], j*(i-j), j*dp[i-j])int max(int p1, int p2)
{return p1 > p2 ? p1 : p2;
}int integerBreak(int n) {// 定义dp数组int dp[n + 1];// 初始化for (int i = 0; i < (n + 1); i++) {dp[i] = 0;}dp[1] = 1;// 从小到大遍历整数for (int i = 2; i <= n; i++) {// 优化遍历for (int j = 1; j <= i / 2; j++) {dp[i] = max(dp[i], max((j * dp[i - j]), j * (i - j)));}}return dp[n];
}

[96] 不同的二叉搜索树

题目描述

96 不同的二叉搜索树
96 不同的二叉搜索树

解题思路

前提:查分二叉树的形态,观察联系
思路:动态规划, dp[i]表示i个结点的二叉搜索树的种数, dp[i] += dp[j] * dp[i - j - 1],其中左子树结点数为j, 右子树结点数为i-j-1。
重点:观察二叉树结点数量之间形态的联系,dp数组的定义,以及 推导公式。

代码实现

C语言
动态规划
// dp[i]表示i个结点的二叉搜索树的种数, dp[i] += dp[j] * dp[i - j - 1]
// 左子树结点数为j, 右子树结点数为i-j-1
int numTrees(int n) {// 定义dp数组int dp[n + 1];// 初始化for (int i = 0; i <= n; i++) {dp[i] = 0;}dp[0] = 1;// 从小到大遍历nfor (int i = 1; i <= n; i++) {for (int j = 0; j < i; j++) {dp[i] += dp[j] * dp[i - j - 1];}}return dp[n];
}

今日收获

  1. 动态规划五步曲:确定dp数组(dp table)以及下标的含义;确定递推公式;dp数组如何初始化;确定遍历顺序;举例推导dp数组。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/853351.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

部署LVS-DR群集...

目录 最后一台主机&#xff08;第四台&#xff09; 本地yum源安装httpd&#xff08;非必做&#xff09; 继续开始从最后一台主机开始&#xff08;第四台&#xff09; 转第二台主机 转第三台主机 回第二台 上传 转第三台主机 上传 回第二台 转第三台 转第一台主机…

Linux Kernel入门到精通系列讲解(RV-Kernel 篇) 5.5 RTC设备编写与实现

1. 概述 上一章节我们已经在QEMU中添加了RTC设备,本章节我们就把RTC设备给移植进入kernel中运行起来,我们移植的Google goldfish_rtc设备,此IP已经在Linux kernel有了Driver,所以我们直接移植设备树即可。 RTC时钟是用来记录当前系统时间的;对于Linux系统来说,时间是一…

Java 项目学习(初始化项目)

后端工程基于 maven 进行项目构建&#xff0c;并且进行分模块开发 参考&#xff1a;Spring或Spring Boot项目目录结构划分和代码分层 1、了解项目的整体结构 sky-take-out maven 父工程&#xff0c;统一管理依赖版本&#xff0c;聚合其他子模块 sky-common 子模块&#xff0c…

【背包题】oj题库

目录 1282 - 简单背包问题 1780 - 采灵芝 1888 - 多重背包&#xff08;1&#xff09;​编辑 1891 - 开心的金明 2073 - 码头的集装箱 1905 - 混合背包 1282 - 简单背包问题 #include <bits/stdc.h> using namespace std; //二维数组:dp[i][j]max(dp[i-1][j],v[i]dp[…

CSS动画(登录页面)

1.整体效果 https://mmbiz.qpic.cn/sz_mmbiz_gif/EGZdlrTDJa6Pfop3IiakrZOtiaiaKniaxeH2Gs407DmkXPsMo8AFKdsYibYcpZiboc24Ulic2CicmyvHmnwCrib7MDe6Jvg/640?wx_fmtgif&fromappmsg&tpwebp&wxfrom5&wx_lazy1&wx_co1 2.完整代码 HTML <!DOCTYPE html&g…

Oracle备份失败处理,看这一篇就够了!

作者&#xff1a;IT邦德 中国DBA联盟(ACDU)成员&#xff0c;10余年DBA工作经验&#xff0c; Oracle、PostgreSQL ACE CSDN博客专家及B站知名UP主&#xff0c;全网粉丝10万 擅长主流Oracle、MySQL、PG、高斯及Greenplum备份恢复&#xff0c; 安装迁移&#xff0c;性能优化、故障…

FLAN-T5模型的文本摘要任务

Text Summarization with FLAN-T5 — ROCm Blogs (amd.com) 在这篇博客中&#xff0c;我们展示了如何使用HuggingFace在AMD GPU ROCm系统上对语言模型FLAN-T5进行微调&#xff0c;以执行文本摘要任务。 介绍 FLAN-T5是谷歌发布的一个开源大型语言模型&#xff0c;相较于之前的…

第一页总结

第一页总结 链表反转206. 反转链表25. K 个一组翻转链表 双指针21. 合并两个有序链表141. 环形链表 链表 反转 206. 反转链表 206. 反转链表 给你单链表的头节点 head &#xff0c;请你反转链表&#xff0c;并返回反转后的链表。 递归思路&#xff1a; 每一个子递归都将当前…

什么是专业的CRM客户管理系统,介绍crm客户管理系统的功能作用

CRM&#xff08;Customer Relationship Management&#xff09;客户管理系统&#xff0c;是现代企业不可或缺的一款管理工具。它集客户信息管理、销售自动化、客户服务与支持、数据分析与决策支持等多项功能于一身&#xff0c;帮助企业实现客户关系的全方位管理&#xff0c;从而…

浏览器必备插件:最新Allow copy万能网页复制下载,解锁网页限制!

今天阿星给大家安利一个超级实用的小工具&#xff0c;专治那些“禁止复制”的网页文字。学生党、资料搜集狂人&#xff0c;你们有福了&#xff01; 想象一下&#xff0c;你在网上冲浪&#xff0c;突然遇到一篇干货满满的文章&#xff0c;正想复制下来慢慢品味&#xff0c;结果…

CubeMX Keil Configure

// 使用外部高速晶振 外部高速晶振为8M&#xff08;根据开发板上的晶振频率设置&#xff09;&#xff0c;使用 PLLCLK&#xff0c;HSE 选项 USART1 使用 Asynchronous&#xff0c;PA9&#xff0c;PA10引脚&#xff08;USART1 引脚根据开发板上引脚设置&#xff09; 设置MDK AR…

Docker Nginx

Docker官网 https://www.docker.com/https://www.docker.com/ 删除原先安装的Docker sudo yum remove docker \ docker-client \ docker-client-latest \ docker-common \ docker-latest \ …

android13 应用冷启动

1 概述 launcher 通过binder到systemserver中atms中发送startActivity请求 startProcess向zygote发送启动新进程请求 zygote收到请求&#xff0c;fork新进程并调用ActivityThread的main初始化 新进程启动&#xff0c;发送attachApplication给ams&#xff0c;告诉他新进程启动…

vuex是什么?如何使用?使用他的功能场景?

Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。它采用集中式存储管理应用的所有组件的状态&#xff0c;并以相应的规则保证状态以一种可预测的方式发生变化。Vuex 也集成到 Vue 官方的开发者工具 extension 中&#xff0c;提供了诸如零配置的 time-travel 调试、状态快照…

php环境变量$_ENV详解

在PHP中&#xff0c;$_ENV 是一个预定义的全局变量&#xff0c;它是一个关联数组&#xff0c;用来存储来自环境变量的信息。环境变 量是在操作系统中设置的、与正在运行的程序相关的变量&#xff0c;可以包含关于系统环境、路径、用户设置等信息。 获取环境变量 当你需要在P…

多维数组切片

使用切片的种类 第一种&#xff1a;使用单个冒号&#xff0c;最全的切片结构&#xff1a;[ start:stop:interval ]第二种&#xff1a;连续使用两个冒号获取带间隔的序列元素或者是实现特定的结果&#xff0c;比如逆序列。多维切片---考虑广播性质 本文要重点提醒的是 多维数组在…

希亦、添可、石头洗地机哪款好用?2024洗地机深度测评

今年的洗地机市场竞争异常激烈&#xff0c;各大品牌纷纷推出了自己的旗舰产品。这对消费者来说是个好消息&#xff0c;因为有更多的选择空间。然而&#xff0c;面对如此多的优质洗地机&#xff0c;选择合适的一款也成了一种“幸福的烦恼”。 作为一个专业的测评人士&#xff0…

kaggle竞赛实战10——特征优化

特征优化思路&#xff1a; 在完成常规流程后&#xff0c;如果不知道怎么办&#xff0c;可以针对文本or时间序列特征进行进一步处理 首先&#xff0c;我们注意到&#xff0c;每一笔信用卡的交易记录都有交易时间&#xff0c;而对于时间字段和文本字段&#xff0c;普通的批量创…

AI赋能软件测试

AI赋能软件测试 AI赋能软件测试软件测试分类软件质量模型:用来衡量软件质量的维度AI赋能软件测试 随着AI时代的到来,如何轻松掌握软件测试新趋势,将AI技术应用于软件测试行业,提高测试速度与测试效率~~ 传智星云AI助手:https://nebula.itcast.cn tips:各种AI工具应有尽有…

git使用http协议时免密pull和push方法

1、创建文件 在项目目录下创建.git-credentials文件&#xff0c;内容如下&#xff0c;填入自己的用户名和密码即可&#xff0c;如果是gitlab&#xff0c;把地址换成自己的gitlab的地址即可。 https://{用户名}:{密码}github.com2、终端执行 git config --global credential.…