LeetCode算法题(Go语言实现)_62

题目

有两种形状的瓷砖:一种是 2 x 1 的多米诺形,另一种是形如 "L" 的托米诺形。两种形状都可以旋转。

给定整数 n ,返回可以平铺 2 x n 的面板的方法的数量。返回对 109 + 7 取模 的值。

平铺指的是每个正方形都必须有瓷砖覆盖。两个平铺不同,当且仅当面板上有四个方向上的相邻单元中的两个,使得恰好有一个平铺有一个瓷砖占据两个正方形。

一、代码实现(动态规划+滚动数组优化)

go 复制代码
func numTilings(n int) int {
    const mod = 1e9 + 7
    if n == 0 {
        return 1
    }
    if n <= 2 {
        return []int{0, 1, 2}[n]
    }
    a, b, c := 1, 1, 2
    for i := 3; i <= n; i++ {
        next := (2*c + a) % mod
        a, b, c = b, c, next
    }
    return c
}

二、算法分析

1. 核心思路
  • 递推关系:发现状态转移方程dpn = 2*dpn-1 + dpn-3
  • 滚动数组优化:仅维护前三个状态值降低空间复杂度
  • 边界处理:直接处理n=0,1,2的特殊情况
2. 关键步骤
  1. 初始化状态:a=dp0=1, b=dp1=1, c=dp2=2
  2. 迭代计算 :
    • 根据递推式更新当前状态
    • 滚动更新前三个状态值
  3. 结果返回:最终c即为所求值
3. 复杂度
指标 值 说明
时间复杂度 O(n) 线性遍历到目标位置
空间复杂度 O(1) 仅使用三个临时变量

三、图解示例

四、边界条件与扩展

1. 特殊场景验证
  • n=0:空面板返回1种方法
  • n=1:只能竖直铺多米诺返回1
  • n=2:两种铺法(两竖直/两水平)返回2
  • 大数测试:验证模运算正确性
2. 扩展应用
  • 三维铺砖:扩展到三维空间铺砖问题
  • 动态瓷砖:处理可变形状瓷砖的铺法
  • 艺术设计:生成具有美学的铺砖图案
3. 多语言实现
java 复制代码
class Solution {
    public int numTilings(int n) {
        final int MOD = 1000000007;
        if (n == 0) return 1;
        if (n <= 2) return new int[]{0,1,2}[n];
        int a = 1, b = 1, c = 2;
        for (int i = 3; i <= n; i++) {
            int next = (2*c % MOD + a) % MOD;
            a = b;
            b = c;
            c = next;
        }
        return c;
    }
}
python 复制代码
class Solution:
    def numTilings(self, n: int) -> int:
        MOD = 10**9 +7
        if n ==0: return 1
        if n <=2: return [0,1,2][n]
        a, b, c = 1, 1, 2
        for _ in range(3, n+1):
            a, b, c = b, c, (2*c +a) % MOD
        return c

五、总结与优化

1. 算法对比
方法 优势 适用场景
动态规划 时间复杂度最优 常规场景
矩阵快速幂 O(log n)时间复杂度 极大n值计算
记忆化递归 代码直观 小规模计算
2. 工程优化
  • 预计算缓存:存储常用值加速重复查询
  • 并行计算:分段计算合并结果
  • SIMD优化:利用向量指令加速计算
3. 扩展方向
  • 非对称瓷砖:处理不同尺寸瓷砖的组合
  • 彩色铺法:考虑颜色搭配的排列组合
  • 拓扑约束:引入连通性等拓扑限制条件
相关推荐
碧海银沙音频科技研究院5 小时前
基于炬芯ATS3089X音箱的音乐播放歌词显示功能实现
人工智能·驱动开发·嵌入式硬件·算法
知识分享小能手5 小时前
C学习教程,从入门到精通,C语言数组 —— 知识点详解(8)
c语言·学习·算法
hetao17338375 小时前
联盟场-提高组-R2 & ZYZSC-S-Round 5
c++·算法
其实防守也摸鱼6 小时前
Codex 下载与本地部署实战指南
linux·服务器·前端·数据库·算法·ai
南极企鹅6 小时前
生产环境gc文件分析
java·jvm·算法
希洛兔6 小时前
原码、反码、补码:一张图讲透计算机里的负数表示
算法·面试
X北辰北6 小时前
C++ 进阶第二阶段总结|STL容器全家桶、迭代器失效、STL算法、序列化入门(工程必备)
开发语言·c++·算法
溪语流沙6 小时前
面试加分项!Manacher:O(n)求最长回文子串的对称之美
java·python·leetcode·面试·职场和发展
过河卒_zh15667666 小时前
再更新!人工智能安全治理指引性文件第三版发布!
人工智能·算法·aigc·生成式人工智能·算法备案
Web3&Basketball6 小时前
昇腾950DT迁移实测:3笔成本账与决策树
服务器·算法·决策树