剑指offer | 面试题11:矩阵覆盖_git


欢迎关注千羽的公众号

剑指offer | 面试题11:矩阵覆盖_剑指offer_02

程序员千羽

想看这本书的小伙伴。公众号后台回复:剑指offer

牛客网 : https://www.nowcoder.com/practice/72a5a919508a4251859fb2cfb987a0e6?tpId=13&tqId=11163&tPage=1&rp=1&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking


GitHub : https://gitee.com/nateshao/leetcode/blob/main/algo-notes/src/main/java/com/nateshao/sword_offer/topic_11_RectCover/Solution.java


剑指 Offer 11. 矩阵覆盖

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


思路:斐波那契数列思想

如果不知道斐波那契数列的,可以看看面试题9or面试题10

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

剑指offer | 面试题11:矩阵覆盖_spring_03剑指offer | 面试题11:矩阵覆盖_git_04图片来源于网络

递归安排上

package com.nateshao.sword_offer.topic_11_RectCover;

/**
* @date Created by 邵桐杰 on 2021/11/20 11:26
* @微信公众号 程序员千羽
* @个人网站 www.nateshao.cn
* @博客 https://nateshao.gitee.io
* @GitHub https://github.com/nateshao
* @Gitee https://gitee.com/nateshao
* Description:
*/
public class Solution {
public static void main(String[] args) {
int rectCover = rectCover(3);
System.out.println("rectCover = " + rectCover);
}

public static int rectCover(int target) {
if (target <= 0) return 0;
else if (target <= 2) return target;
else return rectCover(target - 1) + rectCover(target - 2);
}
}

但是递归时间复杂度太高,这类问题一般归纳到斐波拉契数列,我们可以用动态规划来做,常常用下面这种方法做,时间复杂度比较低

复杂度分析:


  • 时间复杂度 O(N): 计算 f(n) 需循环 n 次,每轮循环内计算操作使用 O(1) 。
  • 空间复杂度 O(1) : 几个标志变量使用常数大小的额外空间。

public static int rectCover2(int target) {
int a = 1, b = 2, sum = 0;
if (target == 0) return 0;
if (target <= 2) return target;
for (int i = 3; i <= target; i++) {
sum = a + b;
a = b;
b = sum;
}
return sum;
}

剑指offer | 面试题11:矩阵覆盖_git_05

革命尚未成功,同志仍需努力,冲冲冲