当前位置: 首页 > news >正文

三步问题(力扣)n种解法 JAVA

目录

  • 题目:
  • 1、dfs:
  • 2、dfs + 备忘录(剪枝):
    • (1)神器 HashMap 备忘录:
    • (2)数组 memo 备忘录:
  • 3、动态规划:
  • 4、利用 static 的储存功能:
    • (1)static 修饰 HashMap:
    • (2)static 修饰 memo 数组:
    • (3)static 修饰 dp 数组 + 动态规划:
  • 5、动态规划 + 优化常数空间:
  • 6、数学 矩阵:

题目:

三步问题。有个小孩正在上楼梯,楼梯有n阶台阶,小孩一次可以上1阶、2阶或3阶。实现一种方法,计算小孩有多少种上楼梯的方式。结果可能很大,你需要对结果模1000000007。

示例1:

输入:n = 3
输出:4
说明: 有四种走法

示例2:

输入:n = 5
输出:13

提示:

n范围在[1, 1000000]之间

解题思路:

记得多次取模防止爆掉int

1、dfs:

class Solution {int INF = 1000000007;public int waysToStep(int n) {return dfs(n) % INF;}public int dfs(int n) {if(n < 0) return 0;if(n == 0) return 1;return ((dfs(n - 1) + dfs(n - 2)) % INF + dfs(n - 3)) % INF;}
}

在这里插入图片描述

显然超时,得剪枝


2、dfs + 备忘录(剪枝):

(1)神器 HashMap 备忘录:

class Solution {int INF = 1000000007;Map<Integer, Integer> map = new HashMap<>();public int waysToStep(int n) {map.put(0, 1);return dfs(n) % INF;}public int dfs(int n) {if(n < 0) return 0;if(map.containsKey(n)) return map.get(n);int ans = ((dfs(n - 1)  + dfs(n - 2)) % INF + dfs(n - 3)) % INF;map.put(n, ans);return ans;}
}

在这里插入图片描述
在这里插入图片描述
当然神器也是有缺陷的即查询需要些许时间,可以试试用数组当备忘录

(2)数组 memo 备忘录:

class Solution {int INF = 1000000007;public static int memo[];public int waysToStep(int n) {memo = new int[n + 1];memo[0] = 1;return dfs(n) % INF;}public int dfs(int n) {if(n < 0) return 0;if(memo[n] != 0) return memo[n];int ans = ((dfs(n - 1) + dfs(n - 2)) % INF + dfs(n - 3)) % INF;memo[n] = ans;return memo[n];}
}

在这里插入图片描述

在这里插入图片描述
速度快了不少,还有突破空间


3、动态规划:

代码:

class Solution {public int waysToStep(int n) {if(n <= 2) return n;if (n == 3) return 4;int[] d = new int[n + 1];d[1] = 1;d[2] = 2;d[3] = 4;for (int i = 4; i <= n; i++){d[i] = (d[i-1] + d[i-2]) % 1000000007 +d[i-3];d[i] %= 1000000007;}return d[n];}
}

在这里插入图片描述
在这里插入图片描述

不太理解为什么会比 dfs + 剪枝快这么多,这里给出的猜测是递归压栈耗费了大量时间

当然26ms还有突破空间


4、利用 static 的储存功能:

之前提到过Java的static修饰变量是有存储功能的不会因为创建新对象就恢复初始化

static简述 JAVA

(1)static 修饰 HashMap:

代码:

class Solution {int INF = 1000000007;public static Map<Integer, Integer> map = new HashMap<>();public int waysToStep(int n) {map.put(0, 1);return dfs(n);}public int dfs(int n) {if(n < 0) return 0;if(map.containsKey(n)) return map.get(n);int ans = ((dfs(n - 1)  + dfs(n - 2)) % INF + dfs(n - 3)) % INF;map.put(n, ans);return ans;}
}

在这里插入图片描述

在这里插入图片描述
时间大概降了一半

(2)static 修饰 memo 数组:

为了更好储存memo数组要设置最大长度

代码:

class Solution {int INF = 1000000007;public static int memo[] = new int[1000001];public int waysToStep(int n) {memo[0] = 1;return dfs(n) % INF;}public int dfs(int n) {if(n < 0) return 0; if(memo[n] != 0) return memo[n];int ans = ((dfs(n - 1) + dfs(n - 2)) % INF + dfs(n - 3)) % INF;memo[n] = ans;return memo[n];}
}

在这里插入图片描述
在这里插入图片描述
速度也是之前的一半


(3)static 修饰 dp 数组 + 动态规划:

充分利用了动态规划的高效以及static的存储功能设立static变量j避免重复更新数据

代码:

class Solution {public static int dp[] = new int[1000000];public static int j;public int waysToStep(int n) { if(dp[n] != 0) return dp[n];if(n <= 2) return n;if (n == 3) return 4;if(j < 3){dp[0] = 1;dp[1] = 1;dp[2] = 2;dp[3] = 4;j  = 4;} for (int i = j; i <= n; i++) dp[i] = ((dp[i-1] + dp[i-2]) % 1000000007 +dp[i-3]) % 1000000007;j = n;return dp[n];}
}

在这里插入图片描述

在这里插入图片描述
偶然能触及12ms的边边


5、动态规划 + 优化常数空间:

代码:

class Solution {public int waysToStep(int n) {if (n == 1) return 1;if (n == 2) return 2;if (n == 3) return 4;long a = 1, b = 2, c = 4, d;while (--n >= 3) {d = a + b + c;a = b;b = c;c = d % 1000000007;}return (int) c;}
}

在这里插入图片描述

在这里插入图片描述

这是网上大佬写的也这么快是我没想到的

目前猜测唯一可能是static修饰变量每次创建新对象仍要创建一次数组,且创建数组需要耗费很多时间


6、数学 矩阵:

class Solution {public static int  waysToStep(int n) {if (n == 1) {return 1;}if (n == 2) {return 2;}if (n == 3) {return 4;}long[][] m = {{1, 1, 1}, {1, 0, 0}, {0, 1, 0}};long[][] mn = pow(m, n - 3);long res = (mn[0][0] * 4 + mn[0][1] * 2 + mn[0][2] * 1) % 1000000007;return (int) res;}public static long[][] pow(long[][] a, int i) {long[][] val = {{1, 0, 0}, {0, 1, 0}, {0, 0, 1}};while (i != 0) {if ((i % 2) == 1)  {val = multiply(val, a);}a = multiply(a, a);i = i / 2;}return val;}public static long[][] multiply(long[][] a, long[][] b) {long[][] c = new long[3][3];for (int i = 0; i < 3; i++) {for (int j = 0; j < 3; j++) {long s = 0;for (int k = 0; k < 3; k++) {s = (s + (a[i][k] % 1000000007 * b[k][j] % 1000000007)) % 1000000007;}c[i][j] = s % 1000000007;}}return c;}
}

在这里插入图片描述

网上大佬写的,真快,给我看傻了

相关文章:

三步问题(力扣)n种解法 JAVA

目录 题目&#xff1a;1、dfs:2、dfs 备忘录&#xff08;剪枝&#xff09;&#xff1a;&#xff08;1&#xff09;神器 HashMap 备忘录&#xff1a;&#xff08;2&#xff09;数组 memo 备忘录&#xff1a; 3、动态规划&#xff1a;4、利用 static 的储存功能&#xff1a;&…...

flask---》登录认证装饰器/配置文件/路由系统

登录认证装饰器 # 0 装饰器的本质原理-# 类装饰器&#xff1a;1 装饰类的装饰器 2 类作为装饰器 # 1 装饰器使用位置&#xff0c;顺序 # 3 flask路由下加装饰器&#xff0c;一定要加endpoint-如果不指定endpoint&#xff0c;反向解析的名字都是函数名&#xff0c;不加装饰器…...

Jvm实际运行情况-JVM(十七)

上篇文章说jmap和jstat的命令&#xff0c;如何查看youngGc和FullGc耗时和次数。 Jmap-JVM&#xff08;十六&#xff09; Jvm实际运行情况 背景&#xff1a; 机器配置&#xff1a;2核4G JVM内存大小&#xff1a;2G 系统运行天数&#xff1a;7天 期间发生FULL GC次数和耗时…...

【BASH】回顾与知识点梳理(二)

【BASH】回顾与知识点梳理 二 二. Shell 的变量功能2.1 什么是变量&#xff1f;2.2 变量的取用与设定: echo, 变量设定规则: set/unset2.3 环境变量的功能用 set 观察所有变量 (含环境变量与自定义变量)export&#xff1a; 自定义变量转成环境变量那如何将环境变量转成自定义变…...

【分布式训练】Accelerate 多卡训练,单卡评测,进程卡住的解决办法

最近想把之前的一个模型的改成多卡训练的。我并不懂DDP&#xff0c;DP。一开始打算使用Transformers的Trainer&#xff0c;但是配置的过程踩了很多坑也没有弄成功。【我是自己写的评测方法&#xff0c;但是我找不到能让触发Trainer去用我的方法评测的路劲】&#xff0c;后来偶然…...

时间复杂度为O(nlogn)的两种排序算法

1.归并排序 归并排序的核心思想&#xff1a;如果要排序一个数组&#xff0c;我们先把数组从中间分成前后两部分&#xff0c;然后对前后两部分分别排序&#xff0c;再将排好序的两部分合并在一起&#xff0c;这样整个数组就都有序了。 归并排序使用的就是分治思想。分治&#x…...

java调用onnx模型,支持yolov5和yolov7

不点star不给解答问题 可直接运行主文件&#xff1a;ObjectDetection_1_25200_n.java 或者 ObjectDetection_n_7.java 都可以直接运行两个可以运行的主文件是为了支持不用网络结构的模型&#xff0c;即使是onnx模型&#xff0c;输出的结果参数也不一样&#xff0c;支持以下两种…...

DP-GAN损失

在前面我们看了生成器和判别器的组成。 生成器损失公式&#xff1a; 首先将fake image 和真实的 image输入到判别器中&#xff1a; 接着看第一个损失&#xff1a;参数分别为fake image经过判别器的输出mask&#xff0c;和真实的label进行损失计算。对应于&#xff1a; 其中l…...

自监督去噪:Noise2Void原理和调用(Tensorflow)

文章原文: https://arxiv.org/abs/1811.10980 N2V源代码: https://github.com/juglab/n2v 参考博客&#xff1a; https://zhuanlan.zhihu.com/p/445840211https://zhuanlan.zhihu.com/p/133961768https://zhuanlan.zhihu.com/p/563746026 文章目录 1. 方法原理1.1 Noise2Noise回…...

Mac 安装配置adb命令环境(详细步骤)

一、注意&#xff1a;前提要安装java环境。 因为android sdk里边开发的一些包都是依赖java语言的&#xff0c;所以&#xff0c;首先要确保已经配置了java环境。 二、在Mac下配置android adb命令环境&#xff0c;配置方式如下&#xff1a; 1、下载并安装IDE &#xff08;andr…...

GDAL C++ API 学习之路 (2) GDALRasterBand篇 代码示例 翻译 自学

GDALRasterBand Class <gdal_priv.h> GDALRasterBand是GDAL中用于表示栅格数据集中一个波段的类。栅格数据集通常由多个波段组成&#xff0c;每个波段包含了特定的数据信息&#xff0c;例如高程、红、绿、蓝色等&#xff0c; 用于表示影像的不同特征。提供了许…...

springboot对静态资源的支持

1、spring boot默认静态路径支持 Spring Boot 默认将 / 所有访问映射到以下目录&#xff1a;** classpath:/static classpath:/public classpath:/resources classpath:/META-INF/resources也就是说什么也不用配置&#xff0c;通过浏览器可以直接访问这几个目录下的文件。 1…...

WPF实战学习笔记27-全局通知

新建消息事件 添加文件&#xff1a;Mytodo.Common.Events.MessageModel.cs using Prism.Events; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Diagnostics;namespace Mytod…...

openSUSE安装虚拟化 qemu kvm

1) 第一种&#xff1a;图形界面yast安装虚拟化 左下角开始菜单搜索yast 点一下就能安装&#xff0c;是不是很简单呢 2&#xff09;第二种&#xff1a; 命令行安装 网上关于openSUSE安装qemu kvm的教程比较少&#xff0c;可以搜索centos7 安装qemu kvm的教程&#xff0c;然后…...

基于linux下的高并发服务器开发(第四章)- 多进程实现并发服务器(回射服务器)

1. socket // 套接字通信分两部分&#xff1a; - 服务器端&#xff1a;被动接受连接&#xff0c;一般不会主动发起连接 - 客户端&#xff1a;主动向服务器发起连接 2.字节序转换函数 当格式化的数据在两台使用不同字节序的主机之间直接传递时&#xff0c;接收端必然错误…...

【程序分析】符号执行

符号执行入门 参考&#xff1a;https://zhuanlan.zhihu.com/p/26927127 给定一个结果&#xff0c;求解对应的程序输入。 经典符号执行与动态符号执行 参考&#xff1a;https://p1kk.github.io/2021/04/04/others/%E7%AC%A6%E5%8F%B7%E6%89%A7%E8%A1%8C&%E6%B1%A1%E7%82…...

实验笔记之——Windows下的Android环境开发搭建

好久一段时间没有进行Android开发了&#xff0c;最新在用的电脑也没有了Android studio了。为此&#xff0c;本博文记录一下最近重新搭建Android开发的过程。本博文仅为本人学习记录用&#xff08;**别看&#xff09; 之前博客也对配置Android做过记录 Android学习笔记之——A…...

#rust taur运行报错#

场景:在window11系统上运行 tauri桌面莹应用&#xff0c;提示错误。 Visual Studio 2022 生成工具 安装的sdk11 , rust运行模式是stable-x86_64-pc-window-gnu&#xff0c; 运行npm run tauir dev 一致失败&#xff0c;失败信息如下 原因&#xff1a;1&#xff1a;在window11系…...

学习购药系统源码:从前端到后端的技术探索

本文将带领读者探索购药系统源码&#xff0c;从前端到后端逐步深入&#xff0c;了解其核心功能和实现方式。我们将使用常见的Web技术&#xff0c;包括HTML、CSS、JavaScript、以及Python的Django框架&#xff0c;展示购药系统的技术奥秘。 前端技术探索 HTML结构搭建 购药系…...

第九次CCF计算机软件认证

第一题&#xff1a;中间数 在一个整数序列 a1,a2,…,an 中&#xff0c;如果存在某个数&#xff0c;大于它的整数数量等于小于它的整数数量&#xff0c;则称其为中间数。 在一个序列中&#xff0c;可能存在多个下标不相同的中间数&#xff0c;这些中间数的值是相同的。 给定一个…...

PHP和Node.js哪个更爽?

先说结论&#xff0c;rust完胜。 php&#xff1a;laravel&#xff0c;swoole&#xff0c;webman&#xff0c;最开始在苏宁的时候写了几年php&#xff0c;当时觉得php真的是世界上最好的语言&#xff0c;因为当初活在舒适圈里&#xff0c;不愿意跳出来&#xff0c;就好比当初活在…...

智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql

智慧工地管理云平台系统&#xff0c;智慧工地全套源码&#xff0c;java版智慧工地源码&#xff0c;支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求&#xff0c;提供“平台网络终端”的整体解决方案&#xff0c;提供劳务管理、视频管理、智能监测、绿色施工、安全管…...

从深圳崛起的“机器之眼”:赴港乐动机器人的万亿赛道赶考路

进入2025年以来&#xff0c;尽管围绕人形机器人、具身智能等机器人赛道的质疑声不断&#xff0c;但全球市场热度依然高涨&#xff0c;入局者持续增加。 以国内市场为例&#xff0c;天眼查专业版数据显示&#xff0c;截至5月底&#xff0c;我国现存在业、存续状态的机器人相关企…...

NLP学习路线图(二十三):长短期记忆网络(LSTM)

在自然语言处理(NLP)领域,我们时刻面临着处理序列数据的核心挑战。无论是理解句子的结构、分析文本的情感,还是实现语言的翻译,都需要模型能够捕捉词语之间依时序产生的复杂依赖关系。传统的神经网络结构在处理这种序列依赖时显得力不从心,而循环神经网络(RNN) 曾被视为…...

关于 WASM:1. WASM 基础原理

一、WASM 简介 1.1 WebAssembly 是什么&#xff1f; WebAssembly&#xff08;WASM&#xff09; 是一种能在现代浏览器中高效运行的二进制指令格式&#xff0c;它不是传统的编程语言&#xff0c;而是一种 低级字节码格式&#xff0c;可由高级语言&#xff08;如 C、C、Rust&am…...

Springboot社区养老保险系统小程序

一、前言 随着我国经济迅速发展&#xff0c;人们对手机的需求越来越大&#xff0c;各种手机软件也都在被广泛应用&#xff0c;但是对于手机进行数据信息管理&#xff0c;对于手机的各种软件也是备受用户的喜爱&#xff0c;社区养老保险系统小程序被用户普遍使用&#xff0c;为方…...

【Linux手册】探秘系统世界:从用户交互到硬件底层的全链路工作之旅

目录 前言 操作系统与驱动程序 是什么&#xff0c;为什么 怎么做 system call 用户操作接口 总结 前言 日常生活中&#xff0c;我们在使用电子设备时&#xff0c;我们所输入执行的每一条指令最终大多都会作用到硬件上&#xff0c;比如下载一款软件最终会下载到硬盘上&am…...

ubuntu22.04有线网络无法连接,图标也没了

今天突然无法有线网络无法连接任何设备&#xff0c;并且图标都没了 错误案例 往上一顿搜索&#xff0c;试了很多博客都不行&#xff0c;比如 Ubuntu22.04右上角网络图标消失 最后解决的办法 下载网卡驱动&#xff0c;重新安装 操作步骤 查看自己网卡的型号 lspci | gre…...

【Post-process】【VBA】ETABS VBA FrameObj.GetNameList and write to EXCEL

ETABS API实战:导出框架元素数据到Excel 在结构工程师的日常工作中,经常需要从ETABS模型中提取框架元素信息进行后续分析。手动复制粘贴不仅耗时,还容易出错。今天我们来用简单的VBA代码实现自动化导出。 🎯 我们要实现什么? 一键点击,就能将ETABS中所有框架元素的基…...

Axure 下拉框联动

实现选省、选完省之后选对应省份下的市区...