LeetCode【剑指offer】系列(动态规划篇)

剑指offer10-I.斐波那契数列

题目链接

题目:斐波那契数(通常用F(n)表示)形成的序列称为斐波那契数列 。该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和。也就是:

F(0) = 0,F(1) = 1
F(n) = F(n - 1) + F(n - 2),其中 n > 1

给定n ,请计算 F(n)

答案需要取模1e9+7(1000000007) ,如计算初始结果为:1000000008,请返回1。

思路:虽然矩阵快速幂也能做,但是这里用动态规划。

通过代码:

class Solution {
public:int fib(int n) {if(n < 2)return n;int mod = 1e9 + 7;int a = 0, b = 1;int res;for(int i = 0; i < n - 1; i++){res = (a + b) % mod;a = b;b = res;}return res;}
};

剑指offer10-II.青蛙跳台阶问题

题目链接

题目:今天的有氧运动训练内容是在一个长条形的平台上跳跃。平台有num个小格子,每次可以选择跳一个格子或者两个格子。请返回在训练过程中,学员们共有多少种不同的跳跃方式。

结果可能过大,因此结果需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。

思路:本质上和上一题一样。

通过代码:

class Solution {
public:int trainWays(int num) {if(num < 2)return 1;int mod = 1e9 + 7;int a = 1, b = 1;int res;for(int i = 0; i < num - 1; i++){res = (a + b) % mod;a = b;b = res;}return res;}
};

剑指offer19.正则表达式匹配

题目链接

题目:请设计一个程序来支持用户在文本编辑器中的模糊搜索功能。用户输入内容中可能使用到如下两种通配符:

  • '.'匹配任意单个字符。
  • '*'匹配零个或多个前面的那一个元素。

请返回用户输入内容 input 所有字符是否可以匹配原文字符串 article

思路:见Leetcode题解

通过代码:

class Solution {
public:bool articleMatch(string s, string p) {int m = s.size() + 1, n = p.size() + 1;vector<vector<bool>> dp(m, vector<bool> (n, false));dp[0][0] = true;for(int i = 2; i < n; i += 2)dp[0][i] = dp[0][i - 2] && p[i - 1] == '*';for(int i = 1; i < m; i++)for(int j = 1; j < n; j++){if(p[j - 1] == '*')dp[i][j] = dp[i][j - 2] || dp[i - 1][j] && s[i - 1] == p[j - 2] || dp[i - 1][j] && p[j - 2] == '.';elsedp[i][j] = dp[i - 1][j - 1] && s[i - 1] == p[j - 1] || dp[i - 1][j - 1] && p[j - 1] == '.';}return dp[m - 1][n - 1];}
};

剑指offer42.连续子数组的最大和

题目链接

题目:某公司每日销售额记于整数数组sales,请返回所有连续一或多天销售额总和的最大值。

要求实现时间复杂度为O(n)的算法。

思路:dp[i]表示以第i天结尾的子数组的最大和。从第i-1天转移到第i天有两种选择:(1)第i天接在前一段得到最大和为dp[i-1] + sales[i],(2)第i天单独成段,最大和为sales[i],二者取较大值完成状态转移即可。最后,遍历过程中用res记录最大值即可。

通过代码:

class Solution {
public:int maxSales(vector<int>& sales) {vector<int> dp(sales.size());dp[0] = sales[0];int res = dp[0];for(int i = 1; i < sales.size(); i++){dp[i] = max(dp[i - 1] + sales[i], sales[i]);res = max(res, dp[i]);}return res;}
};

剑指offer46.把数字翻译成字符串

题目链接

题目:现有一串神秘的密文ciphertext,经调查,密文的特点和规则如下:

  • 密文由非负整数组成
  • 数字0-25分别对应字母a-z

请根据上述规则将密文ciphertext解密为字母,并返回共有多少种解密结果。

思路:首先需要注意,包含前导0不属于合法密文,即01这种无法解密为字母b。dp[i]表示前i个数字的解密结果种数,对于当前数字s[i-1],它可以选择单独作为一个密文,也可以选择和s[i-2]合成一个两位数作为密文。合成两位数需要判断其数值范围是否在10-25之间。

通过代码:

class Solution {
public:int crackNumber(int ciphertext) {string s = to_string(ciphertext);vector<int> dp(s.size() + 1);dp[0] = 1;dp[1] = 1;for(int i = 2; i < dp.size(); i++){string alph = s.substr(i - 2, 2);int num = stoi(alph);if(num >= 10 && num <= 25)dp[i] = dp[i - 1] + dp[i - 2];elsedp[i] = dp[i - 1];}return dp[s.size()];}
};

剑指offer47.礼物的最大值

题目链接

题目:现有一个记作二维矩阵frame的珠宝架,其中frame[i][j] 为该位置珠宝的价值。拿取珠宝的规则为:

  • 只能从架子的左上角开始拿珠宝
  • 每次可以移动到右侧或下侧的相邻位置
  • 到达珠宝架子的右下角时,停止拿取

注意:珠宝的价值都是大于 0 的。除非这个架子上没有任何珠宝,比如frame = [[0]]

思路:dp[i][j]表示走到该位置时的最大价值。要想到达dp[i][j],只能从上面或者左侧到达,因此,取其二者中的最大值加上当前位置的价值即可。

通过代码:

class Solution {
public:int jewelleryValue(vector<vector<int>>& frame) {int n = frame.size(), m = frame[0].size();vector<vector<int>> dp(n + 1, vector<int> (m + 1));for(int i = 1; i <= n; i++)for(int j = 1; j <= m; j++)dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]) + frame[i - 1][j - 1];return dp[n][m];}
};

剑指offer60.n个骰子的点数

题目链接

题目:你选择掷出 num 个色子,请返回所有点数总和的概率。

你需要用一个浮点数数组返回答案,其中第 i 个元素代表这 num 个骰子所能掷出的点数集合中第 i 小的那个的概率。

思路:dp[i][j]表示色子个数为i时第j小的点数的概率,即dp[num]为所需要范围的答案。已知dp[1]的各个点数的概率为1/6,所以对dp[1]进行相应的初始化。已知i-1个色子的概率,需要将状态转移到i个色子。由于多了一个色子,这个色子的点数只能为1-6,且概率分别为1/6。对于dp[i-1][j],加上多的色子的点数,就是对dp[i]造成的影响。收集这种影响即可完成状态转移。

通过代码:

class Solution {
public:vector<double> statisticsProbability(int num) {vector<vector<double>> dp(num + 1, vector<double> (5 * num + 1));for(int i = 0; i < 6; i++)dp[1][i] = 1.0 / 6.0;for(int i = 2; i <= num; i++){for(int j = 0; j < 5 * (i - 1) + 1; j++){for(int k = 0; k < 6; k++)dp[i][j + k] += dp[i - 1][j] / 6.0;}}return dp[num];}
};

剑指offer62.圆圈中最后剩下的数字

题目链接

题目:社团共有num位成员参与破冰游戏,编号为0 ~ num-1。成员们按照编号顺序围绕圆桌而坐。社长抽取一个数字target,从 0 号成员起开始计数,排在第 target位的成员离开圆桌,且成员离开后从下一个成员开始计数。请返回游戏结束时最后一位成员的编号。

思路:约瑟夫环问题。

通过代码:

class Solution {
public:int iceBreakingGame(int num, int target) {int res = 0;for(int i = 2; i <= num; i++)res = (res + target) % i;return res;}
};

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

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

相关文章

JVM 内存分配策略

引言 在 Java 虚拟机&#xff08;JVM&#xff09;中&#xff0c;内存分配与垃圾回收是影响程序性能的核心机制。内存分配的高效性直接决定了对象创建的速率&#xff0c;而垃圾回收策略则决定了内存的利用率以及系统的稳定性。为了在复杂多变的应用场景中实现高效的内存管理&am…

【二分查找】寻找峰值(medium)

6. 寻找峰值&#xff08;medium&#xff09; 题⽬描述&#xff1a;解法⼆&#xff08;⼆分查找算法&#xff09;&#xff1a;算法思路&#xff1a;C 算法代码&#xff1a;Java 算法代码&#xff1a; 题⽬链接&#xff1a;162. 寻找峰值 题⽬描述&#xff1a; 峰值元素是指其值…

MongoDB与PHP7的集成与优化

MongoDB与PHP7的集成与优化 引言 随着互联网技术的飞速发展,数据库技术在现代软件开发中扮演着越来越重要的角色。MongoDB作为一种流行的NoSQL数据库,以其灵活的数据模型和强大的扩展性受到众多开发者的青睐。PHP7作为当前最流行的服务器端脚本语言之一,其性能和稳定性也得…

【GIT】github中的仓库如何删除?

你可以按照以下步骤删除 GitHub 上的仓库&#xff08;repository&#xff09;&#xff1a; &#x1f6a8; 注意事项&#xff1a; ❗️删除仓库是不可恢复的操作&#xff0c;所有代码、issue、pull request、release 等内容都会被永久删除。 &#x1f9ed; 删除 GitHub 仓库步骤…

焊接机排错

焊接机 一、前定位后焊接 两个机台&#xff0c;①极柱定位&#xff0c;相机定位所有极柱点和mark点&#xff1b;②焊接机&#xff0c;相机定位mark点原理&#xff1a;极柱定位在成功定位到所有极柱点和mark点后&#xff0c;可以建立mark点和极柱点的关系。焊接机定位到mark点…

认识和使用Vuex-案例

集中管理共享的数据&#xff0c;易于开发和后期维护&#xff1b;能够高效的实现组件之间的数据共享&#xff0c;提高开发效率&#xff1b;存储在Vuex的数据是响应式的&#xff0c;能够实时保持页面和数据的同步&#xff1b; 安装Vuex依赖包 npm install vuex --save导入包 im…

LLM大模型中的基础数学工具—— 信号处理与傅里叶分析

Q51: 推导傅里叶变换 的 Parseval 定理 傅里叶变换的 Parseval 定理揭示了啥关系&#xff1f; Parseval 定理揭示了傅里叶变换中时域与频域的能量守恒关系&#xff0c;即信号在时域的总能量等于其在频域的总能量。这就好比一个物体无论从哪个角度称重&#xff0c;重量始终不…

对Mac文字双击或三击鼠标左键没有任何反应

目录 项目场景&#xff1a; 问题描述 原因分析&#xff1a; 解决方案&#xff1a; 项目场景&#xff1a; 在使用Mac系统的时候&#xff0c;使用Apple无线鼠标&#xff0c;双击左键能够选取某个单词或词语&#xff0c;三击左键能够选取某一行&#xff0c;&#xff08;百度、…

Go语言企业级项目使用dlv调试

使用dlv调试Go语言代码 打包Go代码(禁止优化和内联&#xff08;便于调试更复杂的逻辑&#xff09;)&#xff1a; go build -gcflags"all-N -l" -o xxx_api_debug.exe启动一个dlb监听可运行程序的端口&#xff1a; dlv --listen:2345 --headlesstrue --api-version…

Kafka命令行的使用/Spark-Streaming核心编程(二)

Kafka命令行的使用 创建topic kafka-topics.sh --create --zookeeper node01:2181,node02:2181,node03:2181 --topic test1 --partitions 3 --replication-factor 3 分区数量&#xff0c;副本数量&#xff0c;都是必须的。 数据的形式&#xff1a; 主题名称-分区编号。 在…

Python3:Jupyterlab 安装和配置

Python3:Jupyterlab 安装和配置 Jupyter源于Ipython Notebook项目&#xff0c;是使用Python&#xff08;也有R、Julia、Node等其他语言的内核&#xff09;进行代码演示、数据分析、机器学习、可视化、教学的非常好的工具。 最新的基于web的交互式开发环境&#xff0c;适用于n…

快速排序及其在Unity游戏开发中的应用

一、快速排序(Quick Sort) 快速排序是一种**分治法(Divide and Conquer)**思想的排序算法,它的基本步骤是: 选一个基准元素(pivot):通常选第一个元素、最后一个元素,或者随机一个。分区(Partition):把数组分成两部分,小于等于 pivot 的放左边,大于 pivot 的放右…

【硬核干货】SonarQube安全功能

原文链接&#xff1a;【硬核干货】SonarQube安全功能 关于晓数神州 晓数神州坚持以“客户为中心”的宗旨&#xff0c;为客户提供专业的解决方案和技术服务&#xff0c;构建多引擎数字化体系。 核心业务1&#xff1a;聚焦DevOps全栈产品&#xff0c;打造需求管理、项目管理、开…

修改el-select背景颜色

修改el-select背景颜色 /* 修改el-select样式--直接覆盖默认样式&#xff08;推荐&#xff09; */ ::v-deep .el-select .el-input__inner {background-color: #1d2b72 !important; /* 修改输入框背景色 */color: #fff; } ::v-deep .el-select .el-input__wrapper {background-…

Unity-粒子系统:萤火虫粒子特效效果及参数

萤火虫特效由两部分组成。萤火虫粒子底色粒子面片。萤火虫的旋转飞动主要由 Noise参数和Color over Lifetime模块控制。 贴图&#xff1a;中间实周边虚的圆&#xff0c;可随意自行制作 Shader&#xff1a;Universal Render Pipeline/2D/Sprite-Lit-Default 以下是粒子详细参…

K8S Service 原理、图例——深度好文

一、理论介绍 1.1、3W 法则 1、是什么&#xff1f; Service 是一种为一组功能相同的 pod 提供单一不变的接入点的资源。当 Service 存在时&#xff0c;它的IP地址和端口不会改变。客户端通过IP地址和端口号与 Service 建立连接&#xff0c;这些连接会被路由到提供该 Service 的…

Alibaba Cloud Linux 3.2104 LTS 64位 容器优化版安装docker docker compose记录

整个安装过程耗时4小时。&#xff08;包含以下检查内容:&#xff09; 检查该linux版本信息&#xff08;并通过监控指标检查运行状态/cpu占用/内存占用/磁盘读取写入IOPS /同时连接数&#xff09; 1&#xff1a;根据当前的系统进行yum与dnf的升级&#xff0c;保持稳定修复的版本…

STM32N6570-DK ISP调试

STM32N6570-DK之ISP调试应用 准备工作-下载安装软件包:一、使用STM32CubeProgrammer给板子烧入STM32N6_ISP_IQTune_App_revC01-v1.1.0-trusted.bin。二、打开STM32 ISP IQTune.exe ,出现可连接端口:三、根据教程进行相应调试:准备工作-下载安装软件包: https://www.st.co…

12.thinkphp验证

一&#xff0e;验证器定义 1. 验证器的使用&#xff0c;我们必须先定义它&#xff0c;系统提供了一条命令直接生成想要的类&#xff1b; php think make:validate User 2. 这条命令会自动在应用目录下生成一个validate文件夹&#xff0c;并生成User.php类&#xff1b; class…

OpenWrt 与 Docker:打造轻量级容器化应用平台技术分享

文章目录 前言一、OpenWrt 与 Docker 的集成前提1.1 硬件与内核要求1.2 软件依赖 二、Docker 环境部署与验证2.1 基础服务配置2.2 存储驱动适配 三、容器化应用部署实践3.1 资源限制策略3.2 Docker Compose 适配 四、性能优化与监控4.1 容器资源监控4.2 镜像精简策略 五、典型问…