
剑指offer打卡Day15:矩形覆盖
发布日期:2021-05-07 22:28:43
浏览次数:24
分类:原创文章
本文共 1173 字,大约阅读时间需要 3 分钟。
剑指offer打卡Day15: 矩形覆盖
题目描述
我们可以用21的小矩形横着或者竖着去覆盖更大的矩形。请问用n个21的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?
比如n=3时,2*3的矩形块有3种覆盖方法:
示例
输入
4
返回值
5
解析:
-
依照题目进行推导,并由此总结规律
-
推导过程如图:
-
由图中的结论不难看出这是一个
斐波那契数列
了,但具体是如何实现?- 以从
n=3
和n=4
推导n=5
的排列
-
以从
n=3
和n=4
推导n=5
的排列
- 以从
-
不难得出结论:
-
第n次组合数包含 由n-1加上一个竖着的矩形
-
第n次组合数包含 由n-2加上两个横着的矩形
-
递归公式为:
|—— f[1] = 1 f[n] = |—— f[2] = 2 |—— f[n-1] + f[n-2] (n>2)
-
-
因此代码可以由递归,动态规划等思路完成
- 参考
-
解答:
//递归:public int rectCover_withRecursion(int target) { if (target < 1) { return 0; } else if (target == 1 || target == 2) { return target; } else { return rectCover(target-1) + rectCover(target-2); }}//动态规划:public int rectCover_withDp(int target) { if(target == 1 || target == 0 || target == 2){ return target; } int[] dp = new int[target+1]; dp[0] = 0; dp[1] = 1; dp[2] = 2; for(int i = 3; i <= target; i++){ dp[i] = dp[i-1] + dp[i-2]; } return dp[target];}//动态规划继续优化public int rectCover——withDpImprove(int target) { if(target==1 || target==2) return target; int a = 1, b=2; int c = 0; for(int i=3;i<=target;i++){ c = b+a; a = b; b = c; } return c;}
发表评论
最新留言
做的很好,不错不错
[***.243.131.199]2025年04月07日 11时11分53秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
c++中的10种常见继承
2019-03-05
【单片机开发】智能小车工程(经验总结)
2019-03-05
【单片机开发】基于stm32的掌上游戏机设计 (项目规划)
2019-03-05
KeepAlived介绍、配置示例、KeepAlived配置IPVS、调用脚本进行监控
2019-03-05
Scala集合-数组、元组
2019-03-05
C++&&STL
2019-03-05
子集(LeetCode 78)
2019-03-05
微信js-sdk使用简述(分享,扫码功能等)
2019-03-05
selenium 的介绍和爬取 jd数据
2019-03-05
mxsrvs支持thinkphp3.2伪静态
2019-03-05
c++中ifstream及ofstream超详细说明
2019-03-05
c++中explicit和mutable关键字探究
2019-03-05
c语言结构体字节对齐详解
2019-03-05
vuex modules
2019-03-05
sleep、wait、yield、join——简介
2019-03-05
web项目配置
2019-03-05
基于单片机简易信号误差分析设计-全套资料
2019-03-05
基于单片机简易脉搏测量仪系统设计-毕设课设资料
2019-03-05
Javascript中String支持使用正则表达式的四种方法
2019-03-05
eclipse引用sun.misc开头的类
2019-03-05