剑指offer-10、矩阵覆盖

晶圆测试厂wafer map管理建议 按照Recipe设定bin定义 应有版本管理概念,一般使用最新版本做为活动版本即可 Bin明细中应包含 BinID、BinCode、BinName、BinType、BinColor、Description BinID可使用数字类型 BinCode可参照实际机台的Bin,用于匹配 有些公司也将BinID、BinCode理解为SBin和HBin 即 Software Bin & Hardware Bin 一般也将BinID对应到客户的Bin BinType 阅读详情

题目描述

我们可以用 2 * 1 的小矩形横着或者竖着去覆盖更大的矩形。请问用n个 2 * 1 的小矩形无重叠地覆盖一个2 * n的大矩形,总共有多少种方法?

比如n=3时,2 * 3 的矩形块有3种覆盖方法:

思路及解答

我们需要用若干个2×1的小矩形(可以横放或竖放)无重叠地覆盖一个2×n的大矩形,求总共有多少种不同的覆盖方法。例如当n=3时,共有3种覆盖方法。

通过观察小规模案例,我们可以发现:

  • n=1时,只有1种方法(竖放)
  • n=2时,有2种方法(两个竖放或两个横放)
  • n=3时,有3种方法
  • n=4时,有5种方法

显然,这形成了一个类似斐波那契数列的规律:f(n) = f(n-1) + f(n-2)。这一题其实和上面青蛙跳台阶和斐波那契数列是一样的,变的只是场景。

递归

递归是解决这类问题最直观的方法。对于2×n的矩形,我们考虑第一块小矩形的放置方式:

  1. 如果竖着放,则剩下的部分是2×(n-1)的矩形,有f(n-1)种方法
  2. 如果横着放,则下方也必须横放一块,剩下的部分是2×(n-2)的矩形,有f(n-2)种方法

因此,总方法数为这两种情况之和:f(n) = f(n-1) + f(n-2),这正是斐波那契数列的递推关系

java

public class Solution {
    public int rectCover(int n) {
        if (n <= 0) return 0;
        if (n == 1) return 1;
        if (n == 2) return 2;
        return rectCover(n - 1) + rectCover(n - 2);
    }
}
  • 时间复杂度:O(2^n),存在大量重复计算
  • 空间复杂度:O(n),递归调用栈深度

动态规划

在递归解法基础上,我们可以加入记忆化存储,避免重复计算。使用一个数组存储已经计算过的结果,每次计算前先检查是否已存储

java

public class Solution {
    
    public int rectCover(int n) {
        if (n <= 0) return 0;
        if (n == 1) return 1;
        if (n == 2) return 2;
        
        int[] dp = new int[n + 1];

		for (int i = 2; i <= n; i++) {
			dp[i] = dp[i - 1] + dp[i - 2];
		}
		
		return dp[n];
    }
}
  • 时间复杂度:O(n),每个子问题只计算一次
  • 空间复杂度:O(n),需要存储中间结果

优化的动态规划(空间优化)

观察发现,计算f(n)只需要前两个状态f(n-1)和f(n-2),因此可以用两个变量代替整个数组,将空间复杂度优化到O(1)。

java

public class Solution {
    public int rectCover(int n) {
        if (n <= 0) return 0;
        if (n == 1) return 1;
        if (n == 2) return 2;
        
        int prev1 = 1, prev2 = 2;
        int result = 0;
        for (int i = 3; i <= n; i++) {
            result = prev2 + prev1;
            prev1 = prev2;
            prev2 = result;
        }
        return result;
    }
}
施耐德 Modicon M580 ePAC 项目实战:从硬件选型到 Control Expert V15 组态 本文详细解析了施耐德 Modicon M580 ePAC 在工业自动化项目中的实战应用,从硬件选型到 Control Expert V15 组态的全流程。重点介绍了水处理站控制系统的硬件配置、网络架构设计、软件安装授权及程序框架开发,帮助工程师高效实施中大型控制系统项目。 阅读详情

相关推荐

数据库:关系运算整理大全(包括关系代数、元组关系演算、域关系演算)

数据库关系运算: 1. 关系代数(基本关系代数、附加关系代数、扩展关系代数) 2. 元组关系演算 3. 域关系演算

ysji's blog 1万+

【剑指Offer】:矩阵覆盖

一:题目描述 我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法? 二:解题分析 完成第n列的拼接,由两个途径 1.小矩阵竖着放,此时实现矩阵全部拼接的方式与拼接 2*(n-1)的矩阵相同 2.小矩阵横着放,则第n-1列与第n列共用横着的小矩阵,此时实现矩阵全部拼接的方式与拼接 2*(n-2)的矩阵相同 所以拼

曦曦慕慕的专栏 562

内存学习(3):DRAM的基础存储结构(存储层级、读写过程,刷新与暂存)

DRAM,全称为 Dynamic Random Access Memory ,中文名是“动态随机存取存储器”。所谓“动态”是和“静态”相对应的,芯片世界里还有一种 SRAM 静态随机存取存储器的存在。笼统地说,DRAM 的结构比 SRAM 更简单,面积占用更小,适合制作大容量的存储芯片;而 SRAM 结构复杂一些,一般使用六个晶体管,面积消耗大,但是读写速度快,而且因为 SRAM 只用到晶体管,所以在工艺上和逻辑芯片相兼容,我们可以在逻辑芯片上直接集成 SRAM。

呆呆象呆呆的博客 2万+

【剑指offer】10.矩阵覆盖

问题描述 我们可以用21的小矩形横着或者竖着去覆盖更大的矩形。请问用n个21的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法? 比如n=3时,2*3的矩形块有3种覆盖方法: 思路 这种很明显的人脑不可穷举的题目,肯定要用递归/dp来做。 本质上,覆盖的方法数为斐波那契数列。画图可得,2*1的小矩形横着或者竖着放置,是两种互斥的情况,即f(n)=f(n-2)+f(n-1) 即,如果小矩形...

weixin_41687289的博客 429

git连接华为软件开发云

我用的是github客户端的git shell 连接。用git bash也可以github客户端下载地址:https://desktop.github.com/1.在华为软件开发云上创建代码仓库2.在本地创建密钥SSH密钥帮助文档公钥是代码托管服务(CodeHub)识别您的用户身份的一种认证方式,通过公钥,您可以将本地git项目与代码托管服务(CodeHub)建立联系, 然后您就可以很方便的将本地...

sigmeta的博客 2113

CloudFlare CDN优化延迟

这两天在倒腾一个小网站,因为刚注册的域名还没来得及备案,所以就解析到了国外的服务器临时撸代码。为了防止不必要的麻烦,所以在前端套了CloudFlare,但是延迟就比较感人了,通常在150+左右还时不时的抽风,所以就找了点资料来优化一下这个延迟问题。然后再新增一些CloudFlare的亚太地区节点ip的A解析,有耐心的可以分为电信线路和联通线路,我比较懒,所以只分了境内和默认。众所周知CloudFlare是智齿cname解析的,那么我们今天就要用到这个办法了,这里要注意一下,默认的解析是不能动的。

Zuozi - 网络从业者长见识就来Zuozi.NET 1084

剑指offer——矩阵覆盖

题目:我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法? 思路:我们知道小矩形可以横着放也可以竖着放,那么现在用f(n)表示种类数,举个例子,                 假设第一个小矩形竖着放,那么剩下的就是f(3), 如果第一个小矩形横着放,那

handsomeKyne 1839

麒麟V10 SP1系统下编译linuxdeployqt并打包Qt 5.15.2程序完整指南

麒麟V10 SP1系统下编译linuxdeployqt并打包Qt 5.15.2程序完整指南

ChenJin_2的博客 276

剑指 Offer 10- 2. 矩阵覆盖

题目描述:       我们可以用2X1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2X1的小矩形无重叠地覆盖一个2Xn的大矩形,总共有多少种方法? 示例: 比如n=3时,2X3的矩形块有3种覆盖方法: 解题思路:       将使用n个2X1的小矩阵去覆盖一个2Xn的大矩形的覆盖方法数量记为f(n),那么很容易可以得出f(1)=1,f(2)=2。要覆盖一个2Xn的大矩阵时,首先覆盖一个2X1的小矩阵,有两种覆盖方法:一种是竖着覆盖,.

剑指offer03——数组中重复的数字 300

Python爬虫实战:携程旅游平台数据爬取(酒店+机票+景点),破解加密与反爬(附完整代码)

携程的反爬机制再复杂,核心逻辑都是“识别非真实用户的请求”,而爬虫的核心就是“让请求看起来像真实用户的行为”。本文的方案从登录态处理、参数加密破解、动态数据抓取,到反爬应对,都是围绕“模拟真实”展开:用Playwright模拟真实浏览器登录,用住宅代理模拟真实用户IP,用随机延迟模拟真实用户的操作频率。掌握了这个核心思路,无论平台的反爬如何升级,都能找到应对方法。当然,爬虫技术是一把双刃剑,合理使用才能发挥其价值。如果你的爬虫项目中遇到了携程的反爬问题,不妨按照本文的步骤试试,大概率能解决问题。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 2606

【乐企文件生成工程】关于乐企文件生成工程的详细介绍

发票文件生成方式有两种思路:1、根据已有的OFD模板,动态替换ofd模板内容;之后将ofd转pdf(局限:单行问题不大)详情可以在此处了解2、根据html模板动态占位:该工程就是这种方式 ,目前效果良好,可看下图。拿去即用的源码!无任何保留,当然也并不是所有票种都支持(时间有限、精力有限、已经连着转了,要冒烟了…)

九七的博客 2031

剑指Offer10 矩阵覆盖

剑指Offer10 矩阵覆盖 题意 我们可以用2x1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2x1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法? 比如n=3时,2*3的矩形块有3种覆盖方法: 思路 我们可以使用的小矩形的为2x1, 需要覆盖的面积为为2*n, 则递归地看,只有两种情况,一种是先固定一块,剩下n-1块,其覆盖方法为f(n-1),如a所示,固定两块(并列),剩下n-2块,其覆盖方法为f(n-2),如b所示: 则对于覆盖长度为n的块有:f(n) = f(n-1) + f(n

qq_39109729的博客 184

71.qt quick-可伸展菜单-抽屉栏示例 通用QML界面(一键换肤)

特点: 支持动态添加item、删除item、自适应界面 附带添加删除、展开等动画 同时支持qwidget、qml加载 支持number提示(比如消息数量等) 侧边抽屉栏支持动画伸展 支持换肤、拖拽、最大化等

抵抗时间扭曲,坚持做一件有意义的事 5286

剑指OFFER-10矩阵覆盖

剑指OFFER-10矩阵覆盖 我们可以用21的小矩形横着或者竖着去覆盖更大的矩形。请问用n个21的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法? 这道题的要点就是对于题干的理解和转换,可以看到大矩形的行上的长度是固定的(2)唯一的变化在于列上的长度(n) 而列上的填充方式:1.2 * 1的小矩阵竖着去覆盖(相当于前进一格) 2.2个2 * 1的小矩阵横着去覆盖(相当于前进两格) 于是这个问题就转换成了青蛙跳格的问题了 定义数组元素的含义:dp[i] 当n为i时的覆盖方法 数组元素之间的关系式:dp

TEDIST的博客 180

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

剑指offer(10)矩阵覆盖

(19.1.5) 剑指offer(10)矩阵覆盖 题目描述 我们可以用21的小矩形横着或者竖着去覆盖更大的矩形。请问用n个21的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法? 这题其实就是青蛙跳。 可以这样想矩阵可以竖着摆,这样就是跳2个台阶,横着摆就是跳一个台阶。观察规律发现 f(n)=f(n-1)+f(n-2) 所以他是一个斐波那契数列。 上代码: function rectCo...

阿洪的博客 173

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

剑指offer 10、 覆盖矩阵 python和c++

题目描述: 我们可以用21的小矩形横着或者竖着去覆盖更大的矩形。请问用n个21的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法? 比如n=3时,2*3的矩形块有3种覆盖方法: 思路:其实这也是一个斐波那契数列,也是跳台阶,我们考虑一个问题,2*n的矩阵怎么才能得到? 答案是: 1、在2*(n-1)的后面加一个竖着的2*1的矩阵 2、在2*(n-2)的后面加两个横着的2*1的矩阵 没了。 想不想跳台阶嘛,那不就是吗,所以代码也简单了 c++版 class Solution { public:

雾隐雾现的至渝博客 2万+

【剑指offer】10矩阵覆盖

原创博文,转载请注明出处! 0.简介 # 本文是牛客网《剑指offer》刷题笔记,笔记索引链接 1.题目 # 用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法? 2.思路 # 2*1的矩阵覆盖2*8的矩阵的方法f(8):用第一个...

weixin_34291004的博客 91

剑指offer10 Javascript版本——矩阵覆盖

题目描述 我们可以用21的小矩形横着或者竖着去覆盖更大的矩形。请问用n个21的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法? 比如n=3时,2*3的矩形块有3种覆盖方法: 本质上还是一个斐波那契数列。 n = 1 的时候 只能横着覆盖,一种 n = 2 的时候 可以横着和竖着覆盖,两种 n = 3 的时候 第三级横着覆盖,用了一级,剩下 n = 2,有两种覆盖方法 第三季竖着覆盖,用了...

czm_orange的博客 268

剑指offer-10:矩阵覆盖

题目描述 我们可以用21的小矩形横着或者竖着去覆盖更大的矩形。请问用n个21的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法? 比如n=3时,2*3的矩形块有3种覆盖方法: 解题思路 该题同斐波那契数列 第n项等于前一项放1块的可能加上前一项放2块的可能 代码实现 public class Solution { public int RectCover(int target) { if (target <= 0) { return 0;

Monkey-yc 129

剑指offer-10:矩阵覆盖

题目描述 我们可以用21的小矩形横着或者竖着去覆盖更大的矩形。请问用n个21的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法? 解题思路 我们知道小矩形可以横着放也可以竖着放,那么现在用f(n)表示种类数,举个例子,2x4的矩形如下图 假设第一个小矩形竖着放,那么剩下的就是f(3), 如果第一个小矩形横着放,那么他底下的也必须横着放,方法数则为余下的f(...

tank的博客 175

剑指offer10-矩阵覆盖

其实跟之前的差不多,这也是个最基本的动态规划问题。 f(n)=f(n-1)+f(n-2); public class Solution { public int RectCover(int target) { if(target<=2){ return target; } int[] dp = new int[...

litianhao0123的博客 200

矩阵覆盖(剑指offer10)

题目描述 我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法? class Solution { public: int rectCover(int number) { int result[3] = {0,1, 2}; if(number< 3) ...

weixin_41036461的博客 204

剑指offer - 10.矩阵覆盖

矩阵覆盖 知识点:递归,斐波那契数列 题目 ​ 我们可以用21的小矩形横着或者竖着去覆盖更大的矩形。请问用n个21的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法? 解析: 依旧是 斐波那契数列 f(n) = f(n-1)+f(n-2) 代码: public int RectCover(int target) { if (target <= 0) ...

weixin_40619157的博客 189

10.矩阵覆盖-剑指offer-Python2.7

剑指offer第10题 牛客网在线编程链接 https://www.nowcoder.com/activity/oj 矩阵覆盖 题目描述 我们可以用2x1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2x1的小矩形无重叠地覆盖一个2xn的大矩形,总共有多少种方法? 思路 将2xn的覆盖方法记为f(n)。 用第一个2x1的矩形去覆盖大矩形的最左边时有两种选择: 横着放和竖着放。横着放的时候,左下角...

Qiankun Wang的博客 527

剑指Offer(牛客网 Java)10——矩阵覆盖

剑指offer-矩阵覆盖 题目描述 我们可以用21的小矩形横着或者竖着去覆盖更大的矩形。请问用n个21的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?

citricl 270

剑指Offer-10-矩阵覆盖

题目 我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法? 解析 这类求种数问题都是有规律,故可以用动态规划来做,如果没有思路,那么可以通过举例子或者画图来描述从而找到问题的解。 1. 当n = 0,f(0) = 0, 矩阵面积为0,所以当然没法放小矩形了。 2. 当n = 1, f(1) = 1。2*1的...

dawn_after_dark的博客 397
上一篇: 中电金信 姓名: - 岗位方向:(需求或开发)开发 手机号: - 笔试题目: 某厂商向某租赁公司可批量或单笔融资租赁需求,单笔融资需求可为以下两种融资租赁方案之一
下一篇: 高级 JAVA 工程师卷 1
普通网友
博客等级 码龄1年 37粉丝 59原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值