每日一道算法题——矩形覆盖
2017-11-27 00:00
459 查看
题目描述
我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?
测试用例:
0 1 2 3 4 … 10
对应输出应该为:
0 1 2 3 5 …
分析:
此题依旧是斐波那契数列。这里只贴出代码,具体的相关分析请参考另一篇博客:Dawson的博客
1.简单的递归:
2.使用循环:
运行测试:
第一种:
运行时间:489ms
占用内存:19184k
第二种:
运行时间:16ms
占用内存:21320k
总结:
好多算法题的原型其实都是统一的,只要抓住核心的算法,稍加变通或是针对性地优化,都能拿出还可以的答案的。问题是如何把问题抽象化、提取出来。
我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?
测试用例:
0 1 2 3 4 … 10
对应输出应该为:
0 1 2 3 5 …
分析:
此题依旧是斐波那契数列。这里只贴出代码,具体的相关分析请参考另一篇博客:Dawson的博客
1.简单的递归:
public class Test1 { public int RectCover(int target) { if (target <=2) { return target; }else return RectCover(target - 1)+RectCover(target-2); } }
2.使用循环:
public class Test1 { public int RectCover(int target) { int Fn1 = 2;//相当于F(n-1) int Fn2 = 1;//相当于F(n-2) int result = 0; if (target <=2) return target; for (int i = 3; i <= target; i++) { result = Fn1 + Fn2; Fn2 = Fn1; Fn1 = result; } return result; } }
运行测试:
第一种:
运行时间:489ms
占用内存:19184k
第二种:
运行时间:16ms
占用内存:21320k
总结:
好多算法题的原型其实都是统一的,只要抓住核心的算法,稍加变通或是针对性地优化,都能拿出还可以的答案的。问题是如何把问题抽象化、提取出来。
相关文章推荐
- 每日一道算法题:1024!末尾有多少个0?
- 每日一道算法题(2)
- 每日一道算法题:微软面试题:在排序数组中,找出给定数字出现的次数
- 每日一道算法题——Longest Valid Parentheses
- 每日一道算法题——Letter Combinations of a Phone Number
- 【每日一道算法题】
- 每日一道算法题6——判断整数序列是不是二元查找树的后序遍历结果
- 每日一道算法题(2)
- 每日一道算法题:Google面试题:给定能随机生成整数1到5的函数,写出能随机生成整数1到7的函数
- 重拾算法之剑指Offier——矩形覆盖
- 每日一道算法题:求数对之差的最大值
- 每日一道算法题:Google 2009年某笔试题:求出元素位于0到9之间的集合A中大于某个给定正整数K的组成的最小正整数。
- 每日一道算法题:两个数组的交集
- 实现能够返回最小值元素的栈(每日一道算法题)
- 用递归函数和栈操作逆序一个栈(每日一道算法题)
- 每日一道算法题(1)
- 每日一道算法题:打印一维数组的所有组合
- 每日一道算法题:数组中出现次数超过一半的数字
- 删除链表的倒数第K个节点(每日一道算法题)
- 【每日一道算法题】