【华为机试】70. 爬楼梯

文章目录

  • 70. 爬楼梯
    • 描述
    • 示例 1
    • 示例 2
    • 提示
    • 解题思路
      • 核心分析
      • 问题建模
      • 算法实现
        • 方法1:动态规划(标准解法)
        • 方法2:空间优化动态规划(最优解)
        • 方法3:递归 + 记忆化
        • 方法4:数学公式(斐波那契通项公式)
        • 方法5:矩阵快速幂
    • 复杂度分析
    • 核心要点
    • 数学推导
      • 递推关系证明
      • 斐波那契数列对应关系
      • 通项公式推导
    • 执行流程图
    • 实际应用
    • 扩展变形
    • 测试用例设计
    • 数学性质
      • 黄金比例的美
      • 奇偶性质
      • 整除性质
      • 平方和性质
    • 完整题解代码

70. 爬楼梯

描述

假设你正在爬楼梯。需要 n 阶你才能到达楼顶。

每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?

示例 1

输入:n = 2
输出:2
解释:有两种方法可以爬到楼顶。

  1. 1 阶 + 1 阶
  2. 2 阶

示例 2

输入:n = 3
输出:3
解释:有三种方法可以爬到楼顶。

  1. 1 阶 + 1 阶 + 1 阶
  2. 1 阶 + 2 阶
  3. 2 阶 + 1 阶

提示

  • 1 <= n <= 45

解题思路

核心分析

这是一道经典的动态规划入门题目,本质上是斐波那契数列的变形。

问题建模

要到达第n阶楼梯,可以从两个位置到达:

  1. 从第(n-1)阶爬1步
  2. 从第(n-2)阶爬2步

因此:f(n) = f(n-1) + f(n-2)

这正是斐波那契数列的递推关系!

算法实现

方法1:动态规划(标准解法)

状态定义

  • dp[i] 表示到达第i阶楼梯的方法数
  • dp[i] = dp[i-1] + dp[i-2]

边界条件

  • dp[1] = 1(只有一种方法:爬1步)
  • dp[2] = 2(两种方法:1+1 或 2)
func climbStairs(n int) int {if n <= 2 {return n}dp := make([]int, n+1)dp[1] = 1dp[2] = 2for i := 3; i <= n; i++ {dp[i] = dp[i-1] + dp[i-2]}return dp[n]
}

时间复杂度:O(n)
空间复杂度:O(n)

方法2:空间优化动态规划(最优解)

由于状态转移只依赖前两个状态,可以用两个变量代替数组。

func climbStairsOptimized(n int) int {if n <= 2 {return n}prev2 := 1  // f(1)prev1 := 2  // f(2)for i := 3; i <= n; i++ {curr := prev1 + prev2prev2 = prev1prev1 = curr}return prev1
}

时间复杂度:O(n)
空间复杂度:O(1)

方法3:递归 + 记忆化

使用递归思路,配合记忆化避免重复计算。

func climbStairsMemo(n int) int {memo := make(map[int]int)return climbStairsMemoHelper(n, memo)
}func climbStairsMemoHelper(n int, memo map[int]int) int {if n <= 2 {return n}if val, exists := memo[n]; exists {return val}result := climbStairsMemoHelper(n-1, memo) + climbStairsMemoHelper(n-2, memo)memo[n] = resultreturn result
}

时间复杂度:O(n)
空间复杂度:O(n)

方法4:数学公式(斐波那契通项公式)

使用贝尔纳公式直接计算斐波那契数列第n项。

func climbStairsFormula(n int) int {if n <= 2 {return n}sqrt5 := math.Sqrt(5)phi := (1 + sqrt5) / 2        // 黄金比例psi := (1 - sqrt5) / 2        // 共轭黄金比例// 斐波那契通项公式:F(n) = (φ^n - ψ^n) / √5// 但这里是 F(n+1),因为我们的序列是 f(1)=1, f(2)=2result := (math.Pow(phi, float64(n+1)) - math.Pow(psi, float64(n+1))) / sqrt5return int(math.Round(result))
}

时间复杂度:O(1)
空间复杂度:O(1)

方法5:矩阵快速幂

使用矩阵快速幂计算斐波那契数列,适合处理大数。

func climbStairsMatrix(n int) int {if n <= 2 {return n}// 转换矩阵: [[1,1],[1,0]]base := [][]int{{1, 1}, {1, 0}}result := matrixPower(base, n-1)// result * [F(2), F(1)] = [F(n+1), F(n)]return result[0][0]*2 + result[0][1]*1
}func matrixPower(matrix [][]int, n int) [][]int {size := len(matrix)result := make([][]int, size)for i := range result {result[i] = make([]int, size)result[i][i] = 1  // 单位矩阵}base := make([][]int, size)for i := range base {base[i] = make([]int, size)copy(base[i], matrix[i])}for n > 0 {if n&1 == 1 {result = matrixMultiply(result, base)}base = matrixMultiply(base, base)n >>= 1}return result
}func matrixMultiply(a, b [][]int) [][]int {size := len(a)result := make([][]int, size)for i := range result {result[i] = make([]int, size)for j := 0; j < size; j++ {for k := 0; k < size; k++ {result[i][j] += a[i][k] * b[k][j]}}}return result
}

时间复杂度:O(log n)
空间复杂度:O(1)

复杂度分析

方法时间复杂度空间复杂度优缺点
标准DPO(n)O(n)思路清晰,易理解
空间优化DPO(n)O(1)最实用的解法 ⭐
记忆化递归O(n)O(n)自顶向下,递归栈开销
数学公式O(1)O(1)最快,但有精度问题
矩阵快速幂O(log n)O(1)适合大数,复杂度低

核心要点

  1. 斐波那契本质:问题等价于求斐波那契数列第(n+1)项
  2. 状态转移:每个状态只依赖前两个状态
  3. 空间优化:可以用O(1)空间代替O(n)空间
  4. 边界处理:n=1和n=2的特殊情况

数学推导

递推关系证明

f(n) 表示到达第n阶楼梯的方法数:

递推关系

f(n) = f(n-1) + f(n-2)  (n ≥ 3)

初始条件

f(1) = 1
f(2) = 2

证明
要到达第n阶,只能从两个位置到达:

  • 从第(n-1)阶爬1步:有 f(n-1) 种方法
  • 从第(n-2)阶爬2步:有 f(n-2) 种方法
  • 总计:f(n-1) + f(n-2) 种方法

斐波那契数列对应关系

爬楼梯序列:1, 2, 3, 5, 8, 13, 21, 34, …
斐波那契序列:1, 1, 2, 3, 5, 8, 13, 21, …

关系climbStairs(n) = fibonacci(n+1)

通项公式推导

斐波那契数列通项公式:

F(n) = (φ^n - ψ^n) / √5

其中:

  • φ = (1 + √5) / 2 ≈ 1.618(黄金比例)
  • ψ = (1 - √5) / 2 ≈ -0.618

因此:

climbStairs(n) = F(n+1) = (φ^(n+1) - ψ^(n+1)) / √5

执行流程图

graph TDA[开始: 输入n] --> B{边界判断}B -->|n ≤ 2| C[返回n]B -->|n > 2| D[选择算法]D --> E[标准DP]D --> F[空间优化DP]D --> G[记忆化递归]D --> H[数学公式]D --> I[矩阵快速幂]E --> J[创建dp数组]F --> K[使用两个变量]G --> L[递归+缓存]H --> M[黄金比例公式]I --> N[矩阵乘法]J --> O[循环计算f1-fn]K --> P[循环更新prev1,prev2]L --> Q[递归计算子问题]M --> R[直接计算结果]N --> S[快速幂计算]O --> T[返回dp[n]]P --> TQ --> TR --> TS --> TC --> U[结束]T --> U

实际应用

  1. 组合计数:计算特定约束下的方案数
  2. 路径规划:网格中的路径计数问题
  3. 动态规划优化:状态压缩的经典例子
  4. 算法面试:考察DP基础的经典题目

扩展变形

  1. 步数扩展:如果可以爬1、2、3步怎么办?
  2. 限制条件:某些台阶不能踩怎么处理?
  3. 成本问题:每步有不同成本,求最小成本
  4. 二维扩展:在网格中从左上到右下的路径数

测试用例设计

// 基础测试
n=11
n=22
n=33
n=45
n=58// 边界测试
n=11 (最小值)
n=451836311903 (题目限制最大值)// 斐波那契验证
n=1089
n=2010946
n=301346269// 性能测试
大数值测试各算法效率对比

数学性质

黄金比例的美

斐波那契数列中相邻两项的比值趋近于黄金比例φ:

lim(n→∞) F(n+1)/F(n) = φ = (1+√5)/2 ≈ 1.618

奇偶性质

F(n) 为偶数 ⟺ n ≡ 0 (mod 3)

整除性质

gcd(F(m), F(n)) = F(gcd(m, n))

平方和性质

F(1)² + F(2)² + ... + F(n)² = F(n) × F(n+1)

完整题解代码

package mainimport ("fmt""math""time"
)// 方法1:动态规划(标准解法)
func climbStairs(n int) int {if n <= 2 {return n}dp := make([]int, n+1)dp[1] = 1dp[2] = 2for i := 3; i <= n; i++ {dp[i] = dp[i-1] + dp[i-2]}return dp[n]
}// 方法2:空间优化动态规划(最优解)
func climbStairsOptimized(n int) int {if n <= 2 {return n}prev2 := 1 // f(1)prev1 := 2 // f(2)for i := 3; i <= n; i++ {curr := prev1 + prev2prev2 = prev1prev1 = curr}return prev1
}// 方法3:递归 + 记忆化
func climbStairsMemo(n int) int {memo := make(map[int]int)return climbStairsMemoHelper(n, memo)
}func climbStairsMemoHelper(n int, memo map[int]int) int {if n <= 2 {return n}if val, exists := memo[n]; exists {return val}result := climbStairsMemoHelper(n-1, memo) + climbStairsMemoHelper(n-2, memo)memo[n] = resultreturn result
}// 方法4:数学公式(斐波那契通项公式)
func climbStairsFormula(n int) int {if n <= 2 {return n}sqrt5 := math.Sqrt(5)phi := (1 + sqrt5) / 2 // 黄金比例psi := (1 - sqrt5) / 2 // 共轭黄金比例// 斐波那契通项公式:F(n) = (φ^n - ψ^n) / √5// 这里是 F(n+1),因为我们的序列是 f(1)=1, f(2)=2result := (math.Pow(phi, float64(n+1)) - math.Pow(psi, float64(n+1))) / sqrt5return int(math.Round(result))
}// 方法5:矩阵快速幂
func climbStairsMatrix(n int) int {if n <= 2 {return n}// 标准斐波那契矩阵:[[1,1],[1,0]]// F(n) = [[1,1],[1,0]]^(n-1) 的第一行第一列// 爬楼梯问题:climbStairs(n) = F(n+1)base := [][]int{{1, 1}, {1, 0}}result := matrixPower(base, n)// result[0][0] = F(n+1), result[0][1] = F(n)return result[0][0]
}func matrixPower(matrix [][]int, n int) [][]int {size := len(matrix)result := make([][]int, size)for i := range result {result[i] = make([]int, size)result[i][i] = 1 // 单位矩阵}base := make([][]int, size)for i := range base {base[i] = make([]int, size)copy(base[i], matrix[i])}for n > 0 {if n&1 == 1 {result = matrixMultiply(result, base)}base = matrixMultiply(base, base)n >>= 1}return result
}func matrixMultiply(a, b [][]int) [][]int {size := len(a)result := make([][]int, size)for i := range result {result[i] = make([]int, size)for j := 0; j < size; j++ {for k := 0; k < size; k++ {result[i][j] += a[i][k] * b[k][j]}}}return result
}// 测试函数
func testClimbingStairs() {fmt.Println("=== 70. 爬楼梯测试 ===")testCases := []struct {name     stringn        intexpected int}{// 基础测试用例{"示例1", 2, 2},{"示例2", 3, 3},{"示例3", 4, 5},{"示例4", 5, 8},// 边界测试用例{"最小值", 1, 1},{"小值测试", 6, 13},// 斐波那契验证{"斐波那契-10", 10, 89},{"斐波那契-15", 15, 987},{"斐波那契-20", 20, 10946},// 中等规模测试{"中等规模-25", 25, 121393},{"中等规模-30", 30, 1346269},// 大规模测试(接近题目限制){"大规模-40", 40, 165580141},{"最大值-45", 45, 1836311903},}methods := []struct {name stringfn   func(int) int}{{"标准DP", climbStairs},{"空间优化DP", climbStairsOptimized},{"记忆化递归", climbStairsMemo},{"数学公式", climbStairsFormula},{"矩阵快速幂", climbStairsMatrix},}for _, tc := range testCases {fmt.Printf("\n测试用例: %s (n=%d)\n", tc.name, tc.n)fmt.Printf("期望输出: %d\n", tc.expected)for _, method := range methods {start := time.Now()result := method.fn(tc.n)duration := time.Since(start)status := "✓"if result != tc.expected {status = "✗"}fmt.Printf("%s %s: %d (耗时: %v)\n",status, method.name, result, duration)}}
}// 性能测试
func performanceTest() {fmt.Println("\n=== 性能测试 ===")testSizes := []int{10, 20, 30, 40, 45}methods := []struct {name stringfn   func(int) int}{{"标准DP", climbStairs},{"空间优化DP", climbStairsOptimized},{"记忆化递归", climbStairsMemo},{"数学公式", climbStairsFormula},{"矩阵快速幂", climbStairsMatrix},}for _, size := range testSizes {fmt.Printf("\n测试规模 n=%d:\n", size)for _, method := range methods {start := time.Now()result := method.fn(size)duration := time.Since(start)fmt.Printf("%s: 结果=%d, 耗时=%v\n",method.name, result, duration)}}
}// 算法分析
func algorithmAnalysis() {fmt.Println("\n=== 算法分析 ===")fmt.Println("时间复杂度:")fmt.Println("  • 标准DP: O(n)")fmt.Println("  • 空间优化DP: O(n)")fmt.Println("  • 记忆化递归: O(n)")fmt.Println("  • 数学公式: O(1) ⭐ 最快")fmt.Println("  • 矩阵快速幂: O(log n)")fmt.Println("\n空间复杂度:")fmt.Println("  • 标准DP: O(n)")fmt.Println("  • 空间优化DP: O(1) ⭐ 最优实用")fmt.Println("  • 记忆化递归: O(n)")fmt.Println("  • 数学公式: O(1)")fmt.Println("  • 矩阵快速幂: O(1)")fmt.Println("\n核心思想:")fmt.Println("  1. 斐波那契数列本质:f(n) = f(n-1) + f(n-2)")fmt.Println("  2. 状态转移:到达第n阶只能从n-1或n-2阶到达")fmt.Println("  3. 空间优化:只需要保存前两个状态")fmt.Println("  4. 数学加速:利用黄金比例直接计算")fmt.Println("\n推荐使用:")fmt.Println("  • 面试/教学: 空间优化DP(平衡了效率和理解难度)")fmt.Println("  • 高性能场景: 数学公式(需要注意浮点精度)")fmt.Println("  • 大数场景: 矩阵快速幂(避免精度问题)")
}// 斐波那契数列分析
func fibonacciAnalysis() {fmt.Println("\n=== 斐波那契数列分析 ===")fmt.Println("爬楼梯与斐波那契的关系:")fmt.Printf("%-10s %-15s %-15s\n", "n", "climbStairs(n)", "fibonacci(n+1)")fmt.Println(repeatString("-", 45))for i := 1; i <= 10; i++ {climb := climbStairsOptimized(i)fib := fibonacci(i + 1)fmt.Printf("%-10d %-15d %-15d\n", i, climb, fib)}fmt.Println("\n黄金比例验证:")for i := 5; i <= 15; i++ {fn := float64(climbStairsOptimized(i))fn1 := float64(climbStairsOptimized(i + 1))ratio := fn1 / fnphi := (1 + math.Sqrt(5)) / 2fmt.Printf("F(%d)/F(%d) = %.10f, φ = %.10f, 差值 = %.2e\n",i+1, i, ratio, phi, math.Abs(ratio-phi))}
}// 辅助函数:计算斐波那契数列
func fibonacci(n int) int {if n <= 2 {return 1}a, b := 1, 1for i := 3; i <= n; i++ {a, b = b, a+b}return b
}// 可视化演示
func visualDemo() {fmt.Println("\n=== 可视化演示 ===")n := 5fmt.Printf("示例: n = %d\n", n)fmt.Println("\n楼梯示意图:")for i := n; i >= 1; i-- {spaces := repeatString(" ", (n-i)*2)fmt.Printf("%s[%d]\n", spaces, i)}fmt.Println(repeatString(" ", n*2) + "[0] 起点")fmt.Println("\n状态转移过程:")fmt.Println("f(1) = 1 (一种方法: 爬1步)")fmt.Println("f(2) = 2 (两种方法: 1+1 或 2)")for i := 3; i <= n; i++ {prev1 := climbStairsOptimized(i - 1)prev2 := climbStairsOptimized(i - 2)curr := prev1 + prev2fmt.Printf("f(%d) = f(%d) + f(%d) = %d + %d = %d\n",i, i-1, i-2, prev1, prev2, curr)}fmt.Printf("\n最终答案: %d种方法\n", climbStairsOptimized(n))
}// 辅助函数:重复字符串
func repeatString(s string, count int) string {if count <= 0 {return ""}result := ""for i := 0; i < count; i++ {result += s}return result
}func main() {// 执行所有测试testClimbingStairs()performanceTest()algorithmAnalysis()fibonacciAnalysis()visualDemo()
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/915411.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/915411.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

山东大学软件学院面向对象期末复习

面向对象 文章目录面向对象04 类封装接口 抽象类05 消息&#xff0c;实例化&#xff0c;静态变量方法消息动/静态类型语言对象创建类及实例具有下面特征对象数组的创建静态数据成员构造函数06_0 继承继承是向下传递的JAVA为什么不支持多重继承继承的形式特殊化继承替换原则规范…

让 Windows 用上 macOS 的系统下载与保姆级使用教程

模拟苹果桌面软件下载&#xff1a;https://xpan.com.cn/s/8NFAGT 还记得 Windows 11刚发布时&#xff0c;很多人就说“果里果气"的&#xff0c;但界面确实做的漂亮。 不知道现在有多少小伙伴正用着macOS&#xff0c;不过我敢确定&#xff0c;喜欢macOS的人绝对不少&#…

嵌入式硬件篇---继电器

继电器是一种通过小电流控制大电流的电磁开关&#xff0c;广泛应用于自动化控制、电力系统和电子设备中。以下从工作原理、应用场景和电路特点三个方面详细介绍&#xff1a;一、工作原理继电器本质是电磁控制的机械式开关&#xff0c;核心部件包括&#xff1a;线圈&#xff08;…

鸿蒙网络编程系列58-仓颉版TLS数字证书查看及验签示例

1. TLS数字证书验签简介 数字证书的签名验证是网络编程中一个重要的功能&#xff0c;它保证了数字证书是由可信任的签发方签署的&#xff0c;在此基础上&#xff0c;我们才可以信任该证书&#xff0c;进而信任基于该证书建立的安全通道&#xff0c;所以说&#xff0c;数字证书…

【React Native】安装配置 Expo Router

过去开发React Native&#xff0c;所使用的路由都是React Navigation。但是这个东西使用起来非常困难&#xff0c;配置无比繁琐。Expo&#xff0c;为了简化操作&#xff0c;就基于React Navigation开发了Expo Router。 Expo Router用起来就要简单的多了&#xff0c;配置也相对…

美国VPS服务器Linux内核参数调优的实践与验证

美国vps服务器Linux内核参数调优的实践与验证在云计算和虚拟化技术日益普及的今天&#xff0c;美国VPS服务器因其稳定的网络环境和优越的性价比&#xff0c;成为众多企业和开发者的首选。Linux内核参数的默认配置往往无法充分发挥VPS的性能潜力。本文将深入探讨美国VPS服务器上…

在Vscode中使用Kimi K2模型:实践指南,三分钟生成个小游戏

Kimi K2是一款基于多专家&#xff08;MoE&#xff09;架构的强大代码与代理能力基础模型。本文将通过在VS Code及其扩展Cline和RooCode中的实际应用&#xff0c;详细说明如何使用Kimi K2-0711-preview模型。不得不说kimi这次的K2模型就是强大&#xff0c;在vscode中配置使用体验…

基于SpringBoot+Uniapp球场预约小程序(腾讯地图API、Echarts图形化分析、二维码识别)

“ &#x1f388;系统亮点&#xff1a;腾讯地图API、Echarts图形化分析、二维码识别”01系统开发工具与环境搭建前后端分离架构 项目架构&#xff1a;B/S架构 运行环境&#xff1a;win10/win11、jdk17前端&#xff1a; 技术&#xff1a;框架Vue.js&#xff1b;UI库&#xff1a;…

windows + phpstorm 2024 + phpstudy 8 + php7.3 + thinkphp6 配置xdebug调试

windows phpstorm 2024 phpstudy 8 php7.3 thinkphp6 配置xdebug调试 下载配置phpstudyPhp.ini配置phpstorm配置xdebug运行一会就停了配置虚拟机 0localhost_90.conf 配置php.ini配置下载 在下面地址下载合适的xdebug 放到对应的php https://xdebug.org/wizard 配置phpst…

python的pywebview库结合Flask和waitress开发桌面应用程序简介

pywebview的用途与特点 用途 pywebview是一个轻量级Python库&#xff0c;用于创建桌面应用程序&#xff08;GUI&#xff09;。它通过嵌入Web浏览器组件&#xff08;如Windows的Edge/IE、macOS的WebKit、Linux的GTK WebKit&#xff09;&#xff0c;允许开发者使用HTML/CSS/Java…

C#通过HslCommunication连接西门子PLC1200,并防止数据跳动的通用方法

textEdit30.Text ReadValue<int>(() > plc.ReadInt32("DB57.DBD16"), ref _last_num).ToString();// 通用读取方法&#xff08;支持所有值类型&#xff09;private T ReadValue<T>(Func<OperateResult<T>> readFunc, ref T lastValue) w…

Linux切换到Jenkins用户解决Jenkins Host key verification failed

以root或sudo user身份, 切换到jenkins用户 su -s /bin/bash jenkins前往jenkins的home目录 cd /var/lib/jenkins/查看.ssh下是否已经有known_hosts, 有的话, 是什么内容, 正常情况下, 这时候是没有对应IP记录的 cd .ssh/ more known_hosts访问一下对应IP, 记录公钥 ssh 192.16…

7.17 Java基础 | 集合框架(下)

接上文&#xff1a; 7.16 Java基础 | 集合框架&#xff08;上&#xff09;-CSDN博客 【1】Map集合 Map 集合是一种能存储键值对的数据结构。它的主要功能是依据键&#xff08;Key&#xff09;来快速查找对应的值&#xff08;Value&#xff09; 1、声明 Map<Integer,Integer…

【LeetCode刷题指南】--反转链表,链表的中间结点,合并两个有序链表

&#x1f525;个人主页&#xff1a;草莓熊Lotso &#x1f3ac;作者简介&#xff1a;C研发方向学习者 &#x1f4d6;个人专栏&#xff1a; 《C语言》 《数据结构与算法》《C语言刷题集》《Leetcode刷题指南》 ⭐️人生格言&#xff1a;生活是默默的坚持&#xff0c;毅力是永久的…

ubuntu上面的wps2019格式很乱在复制粘贴的时候

问题&#xff1a;在复制内容到 Ubuntu 上的 WPS 2019 出现如下问题&#xff1a;列表符号、换行和缩进错乱&#xff0c;表现为每行前的点符号&#xff08;•&#xff09;变成不规则对齐或空格间距不统一。原因分析✅ 主要原因是&#xff1a;WPS 2019 在 Ubuntu 上的兼容性较差&a…

bws-rs:Rust 编写的 S3 协议网关框架,支持灵活后端接入

bws-rs&#xff1a;Rust 编写的 S3 协议网关框架&#xff0c;支持灵活后端接入 bws-rs介绍 bws-rs 是一个用 Rust 编写的轻量级 S3 协议服务端网关框架&#xff0c;旨在帮助开发者快速构建兼容 AWS S3 协议 的对象存储服务。该框架支持 S3 V4 签名校验&#xff0c;集成 Axum 作…

黑马点评系列问题之p70postman报错“服务器异常”

问题描述&#xff1a;在做这个位置的时候报错报错如下控制台报错如下解决根据控制台的报错来看&#xff0c;是​Redis模板未注入导致的空指针异常经过排查&#xff0c;原因是这里少了个Resource

Docker搭建Elasticsearch和Kibana

1.安装docker&#xff0c;确保正常启动 2.按步骤操作&#xff0c;这里的es是单节点的&#xff0c;如需多节点&#xff0c;需安装docker-compose进行yml文件的编写对容器进行编排 #docker拉镜像 docker pull docker.elastic.co/elasticsearch/elasticsearch:7.11.2 docker pul…

【深度学习笔记 Ⅰ】3 step by step (jupyter)

1. 导包 import numpy as np import h5py import matplotlib.pyplot as plt from testCases_v2 import * from dnn_utils_v2 import sigmoid, sigmoid_backward, relu, relu_backward% matplotlib inline plt.rcParams[figure.figsize] (5.0, 4.0) # set default size of plo…

前端流式渲染流式SSR详解

以下是关于前端流式渲染及流式SSR&#xff08;Server-Side Rendering&#xff09;的详细解析&#xff0c;结合核心原理、技术实现、优化策略及实际应用场景展开说明&#xff1a;⚙️ 一、流式渲染基础原理 核心概念 ◦ 流式渲染&#xff1a;数据通过分块传输&#xff08;Chunke…