【OJ】动归练习二

个人主页 : zxctscl
如有转载请先通知

题目

  • 1. 91.解码方法
    • 1.1 分析
    • 1.2 代码
  • 2. 62.不同路径
    • 2.1 分析
    • 2.2 代码
  • 3. 63.不同路径 II
    • 3.1 分析
    • 3.2 代码

1. 91.解码方法

在这里插入图片描述

1.1 分析

题目所述就是把一串数字反向解码为字母映射出来,有多少种方法。
题目也说,一个单独的数字可以映射的,但是这个数字前面是0的话就不可以。

来看看题目给的示例:
226就有三种解码方式:它可以解码为 “BZ” (2 26), “VF” (22 6), 或者 “BBF” (2 2 6)
在这里插入图片描述

  1. 以i位置,要求的就是以i位置结尾方法的总数;
  2. 状态表示方程:来找解码到i位置时最近的一步,可以分成两种情况:(1)i这个位置单独解码;(2)i位置和i-1结合一起共同解码。这两种情况都会出现解码失败和成功的情况。
    (1)以i位置单独解码,如果这个数字在1-9之间,就能成功也就是有dp[i-1]种;如果失败就是0;
    (2)i位置和i-1结合一起共同解码,如果这两个数字结合在10-26之间,就解码成功,所以解码成功就是dp[i-2],;解码失败就是0。
    状态表示方程:dp[i]=dp[i-1]+dp[i-2],都是成功时候才加。
  3. 初始化,要把0位置和1位置。以0位置结尾说明就只有一个字符,在1-9之间就成功就是1,如果失败就是0。以1位置进位有三种情况:(1)两个字符都可以单独解码;(2)两个字母合在一起解码成功;(3)前面两种都不存在。它的解码数可能是0,1或者2。
  4. 填表顺序:从左往右
  5. 返回值:这个字符串的解码方式,也就是到字符串i-1位置:dp[i-1]

在这里插入图片描述
优化:处理边界以及初始化问题
多开一个虚拟位置,有什么用呢?
在旧的初始化列表中,初始化dp[1]是比较麻烦的,如果把它放在填表位置就会比较轻松。
在这里插入图片描述

得注意:1. 保证虚拟节点位置值是正确的;2.得注意下标映射关系
当要在新的dp表里面2的结果就要用到0和1位置的值。这里dp[0]=1,要想在2位置解码成功,那么0位置必须是解码成功的。
在新的dp表里面的i统一都对应把位置往后面移动了一位,这里在写代码的时候就得减1。
在这里插入图片描述

1.2 代码

class Solution {
public:
    int numDecodings(string s) {
        int n=s.size();
        vector<int> dp(n);
        dp[0]=s[0]!='0';
        if(n==1)return dp[0];

        if(s[0]!='0'&&s[1]!='0') dp[1]+=1;

        int t=(s[0]-'0')*10+s[1]-'0';
        if(t>=10&&t<=26) dp[1]+=1;

        for(int i=2;i<n;i++)
        {
            if(s[i]!='0')dp[i]+=dp[i-1];
            int t=(s[i-1]-'0')*10+s[i]-'0';
            if(t>=10&&t<=26) dp[i]+=dp[i-2];
        }
        return dp[n-1];
    }
};

优化后:

class Solution {
public:
    int numDecodings(string s) {
        int n=s.size();
        vector<int> dp(n+1);
        dp[0]=1;
        dp[1]=s[1-1]!='0';
        for(int i=2;i<=n;i++)
        {
            if(s[i-1]!='0')dp[i]+=dp[i-1];
            int t=(s[i-2]-'0')*10+s[i-1]-'0';
            if(t>=10&&t<=26) dp[i]+=dp[i-2];
        }
        return dp[n];
    }
};

2. 62.不同路径

在这里插入图片描述

2.1 分析

题目要求不能回退,就是不能往左和往上。
如果有3*2个表格:那么到达就有三种情况:
在这里插入图片描述

  1. 状态表示:以i位置为结尾,就是走到i位置有多少种方式。
  2. 状态转移方程:根据最近的一步划分有两种情况:到达[i][j]位置,(1)从上面一个[i-1][j]下来一步;(2)从左边[i][j-1]过来一步
    状态转移方程:dp[i][j]=dp[i-1][j]+dp[i]dp[j-1]。
  3. 初始化,下面这些位置可能会存在越界在这里插入图片描述
    所以可以先初始化这些可能初始化的位置。还可以在外面先虚拟一些空间,让下面这些就不会越界:
    在这里插入图片描述
    这些虚拟空间的值要保证后面填表顺序是正确的,要想填表正确,虚拟空间值设置就是:
    在这里插入图片描述
  4. 填表顺序:从左往右,从上往下
  5. 返回值:看题目要求直接返回dp[m][n]就行

在这里插入图片描述

2.2 代码

class Solution {
public:
    int uniquePaths(int m, int n) {

        vector<vector<int>> dp(m + 1, vector<int>(n + 1));
        dp[0][1] = 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][n];

    }
};

3. 63.不同路径 II

在这里插入图片描述

3.1 分析

题目与上面的类型是相同的,就是多了一个障碍物。
在这里插入图片描述

  1. 状态表示:以i位置为结尾,就是走到i位置有多少种方式。
  2. 状态转移方程:根据最近的一步划分有三种情况:到达[i][j]位置,(1)从上面一个[i-1][j]下来一步;(2)从左边[i][j-1]过来一步;(3)这个位置时障碍物那么就是0,就多加一个判断障碍物就可以了。
    状态转移方程:dp[i][j]=dp[i-1][j]+dp[i]dp[j-1]。
  3. 初始化,下面这些位置可能会存在越界,所以就多开一组虚拟空间,得注意下标的映射。如果是障碍物位置就得对应减一。
    在这里插入图片描述
  4. 填表顺序:从左往右,从上往下
  5. 返回值:看题目要求直接返回dp[m][n]就行

在这里插入图片描述

3.2 代码

class Solution {
public:
    int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) {
        int m=obstacleGrid.size(),n=obstacleGrid[0].size();

       vector<vector<int>> dp(m + 1, vector<int>(n + 1));
        dp[0][1] = 1;

        for (int i = 1; i <= m; i++)
            for (int j = 1; j <= n; j++)
             if(obstacleGrid[i-1][j-1]==0)
                dp[i][j] = dp[i - 1][j] + dp[i][j - 1];
        return dp[m][n];
    }
};

有问题请指出,大家一起进步!!!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于java+SpringBoot+Vue的篮球竞赛预约平台设计与实现

基于javaSpringBootVue的篮球竞赛预约平台设计与实现 开发语言:Java数据库:MySQL技术:SpringBootMyBatis工具:IDEA/Ecilpse、Navicat、Maven 系统展示 前台展示 后台展示 系统简介 篮球竞赛预约平台以springboot作为框架&#xff0c;b/s模式以及MySql作为后台运行的数据库&a…

线程池的7大参数

线程池的7大参数 一、 corePoolSize 线程池核心线程大小 核心线程永远不会销毁&#xff0c;即使他们处于空闲状态&#xff0c;除非设置了allowCoreThreadTimeOut。任务提交到线程池后&#xff0c;首先会检查当前线程数是否达到了corePoolSize&#xff0c;如果没有达到的话&…

蜜罐技术简介

1.什么是蜜罐 蜜罐技术本质上是一种对攻击方进行欺骗的技术&#xff0c;通过布置一些作为诱饵的主机、网络服务或者信息&#xff0c;诱使攻击方对它们实施攻击。这种技术允许防御方捕获和分析攻击行为&#xff0c;从而了解攻击方所使用的工具与方法&#xff0c;推测攻击意图和…

360奇酷刷机 360刷机助手 QIKU Download Assistant

360奇酷刷机 360刷机助手 QIKU Download Assistant 破 解 360手机刷机资源下载链接&#xff1a;360rom.github.io 参考&#xff1a;360手机-360刷机360刷机包twrp、root 360奇酷刷机&#xff1a;360高通驱动安装 360手机刷机驱动&#xff1b;手机内置&#xff0c;可通过USB文件…

2核4g服务器能支持多少人访问?全网最全测评

腾讯云轻量应用服务器2核4G5M配置性能测评&#xff0c;腾讯云轻量2核4G5M带宽服务器支持多少人在线访问&#xff1f;并发数10&#xff0c;支持每天5000IP人数访问&#xff0c;腾讯云百科txybk.com整理2核4G服务器支持多少人同时在线&#xff1f;并发数测试、CPU性能、内存性能、…

【Android】图解View事件分发机制

文章目录 View事件分发机制dispartchTouchEvent()dispatchTouchEvent() 方法主要负责什么&#xff1f; onTouchEvent(event) 点击事件分发的传递规则自上而下自下而上 View事件分发机制 View的事件分发机制是Android中非常核心的一个概念&#xff0c;它负责处理触摸事件&#…

[Java基础揉碎]抽象类

目录 通过问题引出 介绍 关键点 细节 ​编辑 抽象类的最佳设计模式--模版设计模式 1.先用最容易想到的方法 2.分析问题&#xff0c;提出使用模板设计模式 通过问题引出 假如我们有个动物类, 动物都有eat吃的方法, 但是具体吃什么, 我们不知道, 因为是什么动物我们不知道…

【Unity】uDD插件抓屏文字显示不清晰怎么办?

【背景】 之前介绍过用一款简称uDD&#xff08;uDesktopDuplication&#xff09;的开源插件抓取电脑桌面。整体效果不错&#xff0c;看电影很流畅。但是当切换到文档&#xff0c;或者仔细看任何UI的文字部分时&#xff0c;发现就模糊了。 【分析】 由于是依托于Canvas上的Te…

如何利用python 把一个表格某列数据和另外一个表格某列匹配 类似Excel VLOOKUP功能

环境: python3.8.10 Excel2016 Win10专业版 问题描述: 如何利用python 把一个表格某列数据和另外一个表格某列匹配 类似Excel VLOOKUP功能 先排除两表A列空白单元格,然后匹配x1表格和x2表格他们的A列,把x1表格中A列A1-A810范围对应的B列B1-B810数据,匹配填充到x2范围…

Microsoft Excel 快捷键 (keyboard shortcut - hotkey)

Microsoft Excel 快捷键 [keyboard shortcut - hotkey] References 表格内部换行快捷键 Alt Enter 快速将光标移到表末 Ctrl End 快速将光标移到表首 Ctrl Home References [1] Yongqiang Cheng, https://yongqiang.blog.csdn.net/

416. 分割等和子集

思路&#xff1a;一道简单的01背包的dp&#xff0c;判断背包和为sum/2的背包是否存在。 一维01背包&#xff0c;第一层枚举物品i&#xff0c;第二层从后往前遍历容量sum/2->nums[i]&#xff0c;因为小于nums[i]就没意义了&#xff0c;不用考虑&#xff0c;肯定是不存在的。 …

4.1 RK3399项目开发实录-案例开发之MIPI 摄像头开发(wulianjishu666)

嵌入式从零到项目开发全套例程资料 链接&#xff1a;https://pan.baidu.com/s/1ksCQN__jD8ZrJhw8sWzhwQ?pwdvvfz 3.2. MIPI 摄像头 带有 MIPI CSI 接口的 RK3399 板子都添加了双 MIPI 摄像头 OV13850 的支持&#xff0c;应用中也添加了摄像头的例子。下面介绍一下相关配置。…

信息系统项目管理(第四版)(高级项目管理)考试重点整理 第15章 项目风险管理(四)

博主2023年11月通过了信息系统项目管理的考试&#xff0c;考试过程中发现考试的内容全部是教材中的内容&#xff0c;非常符合我学习的思路&#xff0c;因此博主想通过该平台把自己学习过程中的经验和教材博主认为重要的知识点分享给大家&#xff0c;希望更多的人能够通过考试&a…

C语言程序与设计——预处理命令

宏 在C语言中宏有三种形式: 定义符号常量定义傻瓜表达式定义代码段 在使用宏的过程中需要注意的是&#xff0c;宏的作用仅仅是在预处理阶段对代码进行替换&#xff0c;而非进行运算&#xff0c;所以在使用时&#xff0c;如果出现了我们预期之外的结果&#xff0c;很有可能是宏…

Linux Load AVG linux 平均负载是什么? 简单解释说明

linux 命令基础汇总 命令&基础描述地址linux curl命令行直接发送 http 请求Linux curl 类似 postman 直接发送 get/post 请求linux ln创建链接&#xff08;link&#xff09;的命令创建链接&#xff08;link&#xff09;的命令linux linklinux 软链接介绍linux 软链接介绍l…

Java代码基础算法练习-搬砖问题-2024.03.25

任务描述&#xff1a; m块砖&#xff0c;n人搬&#xff0c;男搬4&#xff0c;女搬3&#xff0c;两个小孩抬一砖&#xff0c;要求一次全搬完&#xff0c;问男、 女、小孩各若干&#xff1f; 任务要求&#xff1a; 代码示例&#xff1a; package M0317_0331;import java.util.S…

VUE:内置组件<Teleport>妙用

一、<Teleport>简介 <Teleport>能将其插槽内容渲染到 DOM 中的另一个位置。也就是移动这个dom。 我们可以这么使用它: 将class为boxB的盒子移动到class为boxA的容器中。 <Teleport to".boxA"><div class"boxB"></div> &…

RuoYi-Vue若依框架-新增子模块启动后,前端页面报接口404

如何新建子模块可以参考RuoYi-Vue若依框架-如何新增子模块 我在新增依赖的时候提过版本号的问题&#xff0c;如果不是按照我的博客走的&#xff0c;然后接口报了404&#xff0c;可以选择添加父版本号&#xff0c;官方的参考文档是没写的&#xff0c;但添加了确实能解决这个问题…

数字芯片retention cell

​低功耗设计一直是芯片设计的重中之重&#xff0c;景芯SoC训练营采用的低功耗技术有&#xff1a; 1、Clk gating&#xff0c;关掉不工作模块的时钟信号&#xff1b; 2、Power gating&#xff0c;关掉不工作模块的电源&#xff1b; 由于省去了leakage power&#xff0c;Powe…

蓝桥杯第十五届抱佛脚(三)枚举法与尺取法

蓝桥杯第十五届抱佛脚&#xff08;三&#xff09;枚举法与尺取法 很多人将蓝桥杯戏称为“暴力杯”&#xff0c;因为蓝桥杯采用了OI的赛制。在这种赛制下&#xff0c;即使对于某些大题答案不清楚的情况下&#xff0c;也可以通过暴力方法获得部分分数。一提到暴力&#xff0c;人…