力扣动态规划基础版(斐波那契类型)

70. 爬楼梯icon-default.png?t=O83Ahttps://leetcode.cn/problems/climbing-stairs/

70.爬楼梯

方法一 动态规划

考虑转移方程和边界条件:

f(x) =  f(x -1) + f(x  - 2);f(1) = 1;f(2) = 2;

class Solution {public int climbStairs(int n) {//到第一阶的方法int p = 1;//到第二阶的方法int q = 2;if(n == 1){return p;}else if(n ==2){return q;}else{int r = 3;for(int i = 3; i <= n; i++){r = q + p;p = q;q = r;}return r;}}
}

时间复杂度为O(n)

方法二 矩阵快速幂

需要构造一下 ,对于齐次线性传递

class Solution {public int climbStairs(int n) {int [][] q= {{1,1},{1,0}};int[][] res = pow(n,q);return res[0][0];}//做一个矩阵的乘方public int[][] pow(int n,int[][] a){//做一个单位矩阵int[][] ret  = {{1,0},{0,1}};while(n > 0){//用到一个位运算if((n & 1) == 1){ret = multiply(ret,a);}n >>= 1;a = multiply(a,a);}return ret;}//根据构造的矩阵定义public int[][] multiply(int a[][],int b[][]){int c[][] = new int[2][2];for(int i = 0; i < 2; i++){for(int j = 0;j < 2;j++){c[i][j] = a[i][0] * b[0][j] + a[i][1] * b[1][j];}}return c;}
}

关于为什么第一个元素就是结果:

这里如果麻烦一点的话,假如这个初始向量不是1,1那你可以先用这个操作,然后最后×初始向量,但是要重新定义一个函数就是1*2的矩阵和2*2的矩阵相乘的方法 

509.斐波那契数

509. 斐波那契数icon-default.png?t=O83Ahttps://leetcode.cn/problems/fibonacci-number/

方法一 动态规划

和爬楼梯的转移条件都是一模一样的

class Solution {public int fib(int n) {int p = 0,q = 1,r = 0;if(n < 2){return n;}else{for(int i = 2; i <= n; i++){r = p + q;p = q;q = r;}return r;}}
}

方法二 矩阵快速幂

 和爬楼梯唯一的不同点就是主函数要用n -1

class Solution {public int fib(int n) {if (n < 2) {return n;}int  r[][] = {{1,1},{1,0}};int res[][] =  pow(n - 1,r);return res[0][0];}public int[][] pow(int n ,int[][] c){int [][]r = {{1,0},{0,1}};while(n > 0){if((n & 1) == 1){r = mul(r,c);}n >>= 1;c = mul(c,c);}return r;}public int[][] mul(int a[][],int b[][]){int r[][]  = new int[2][2];for(int i = 0; i < 2; i++){for(int j = 0;j < 2; j++){r[i][j] = a[i][0] * b[0][j] +  a[i][1]*b[1][j];}}return r;}}

 1137.第N个泰伯那契数

1137. 第 N 个泰波那契数icon-default.png?t=O83Ahttps://leetcode.cn/problems/n-th-tribonacci-number/

方法一 动态规划

class Solution {public int tribonacci(int n) {int p = 0,q = 1,r = 1;if(n == 0){return 0;}else if(n == 1){return 1; }else if(n == 2){return 1;}else{for(int i = 3; i <= n; i++){int   m = p + q + r;p = q;q = r;r = m;}return r;}}
}
class Solution {public int tribonacci(int n) {int p = 0,q = 1,r = 1;if(n == 0){return 0;}else if(n == 1){return 1; }else if(n == 2){return 1;}else{for(int i = 3; i <= n; i++){int   m = p + q + r;p = q;q = r;r = m;}return r;}}
}

746.使用最小花费爬楼梯 

746. 使用最小花费爬楼梯icon-default.png?t=O83Ahttps://leetcode.cn/problems/min-cost-climbing-stairs/分析一手核心问题还是找到这个状态转移方程

dp[i] = Math.min(dp[i -1] + cost[i -1], dp[i -2] + cost[i -2]);
class Solution {public int minCostClimbingStairs(int[] cost) {int n = cost.length;int[] dp = new int[n + 1];dp[0] = dp[1] = 0;for(int i = 2;i <= n;++i){dp[i] = Math.min(dp[i -1] + cost[i -1], dp[i -2] + cost[i -2]);}return dp[n];}
}

 时间:O(n) 空间O(n),可以发现第i项只和i -1 和i -2相关,所以可以用一个滚轮降低空间复杂度

class Solution {public int minCostClimbingStairs(int[] cost) {int n = cost.length;int[] dp = new int[n + 1];int pre = 0; int cur = 0;for(int i = 2;i <= n;++i){int nex = Math.min(cur + cost[i - 1],pre + cost[i - 2]);pre = cur;cur = nex;}return cur;}
}

这样的话空间复杂度就是O(1)了

198.打家劫舍

198. 打家劫舍icon-default.png?t=O83Ahttps://leetcode.cn/problems/house-robber/核心还是去找边界条件和这个状态转移方程,这个题目状态转移方程没以前那么好想两种假设:

1.偷窃第k间房屋,就不能偷窃第k - 1间房屋,偷窃总金额为前 k−2 间房屋的最高总金额与第 k 间房屋的金额之和。

2.不偷窃第 k 间房屋,偷窃总金额为前 k−1 间房屋的最高总金额。

边界条件:dp[0]的话就是nums【0】,dp【1】的话就是两个最大的、

状态转移方程:

dp[i] = Math.max(dp[i - 1],dp[i - 2] + nums[i]);
class Solution {public int rob(int[] nums) {if(nums == null){return 0;}int length = nums.length;if(length == 1){return nums[0];}int[] dp = new int[length];dp[0] = nums[0];dp[1] = Math.max(nums[0],nums[1]);for(int i = 2; i < length; i++){dp[i] = Math.max(dp[i - 1],dp[i - 2] + nums[i]);}return dp[length -1];}
}

模仿上一道题,这个题也能变成轮询的问题,降低空间复杂度

class Solution {public int rob(int[] nums) {if(nums == null){return 0;}int length = nums.length;if(length == 1){return nums[0];}if(length == 2){return Math.max(nums[0],nums[1]);}int pre = nums[0];int cur = Math.max(nums[0],nums[1]);for(int i = 2; i < length; i++){int nex = Math.max(cur,pre + nums[i]);pre = cur;cur = nex;}return cur;}
}

740.删除并获得点数 

740. 删除并获得点数icon-default.png?t=O83Ahttps://leetcode.cn/problems/delete-and-earn/题目有一点晦涩难懂,看了题解以后恍然大悟,发现就是一个乱序的打家劫舍哈哈哈,需要找出这个最大值,做一个数组,再用打家劫舍的函数就解决了,这个第一次做有点难想到动态规划

class Solution {public int deleteAndEarn(int[] nums) {int Maxval = 0;for(int val : nums){Maxval = Math.max(val,Maxval);}int [] sums = new int[Maxval + 1];//for(int val : nums){sums[val] += val;}return rob(sums);}
//纯打家劫舍public int rob(int[] nums){int n = nums.length;int dp[] = new int[n];dp[0] = nums[0];dp[1] = Math.max(nums[0],nums[1]);for(int i = 2; i < n; ++i){dp[i] = Math.max(dp[i - 1],dp[i - 2] + nums[i]);}return dp[n - 1];}
}

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

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

相关文章

构建IP代理池的实现过程:从零开始的指南

在网络爬虫和数据采集的世界中&#xff0c;IP代理池是一个必不可少的工具。它不仅可以帮助您绕过一些网站的反爬虫机制&#xff0c;还能提高数据采集的效率和稳定性。本文将详细介绍如何从零开始构建一个IP代理池&#xff0c;让您在信息的海洋中游刃有余。 什么是IP代理池&…

NeRF三维重建—神经辐射场Neural Radiance Field(二)体渲染相关

NeRF三维重建—神经辐射场Neural Radiance Field&#xff08;二&#xff09;体渲染相关 粒子采集部分 粒子采集的部分我们可以理解为&#xff0c;在已知粒子的情况下&#xff0c;对图片进行渲染的一个正向的过程。 空间坐标(x,y,z&#xff09;发射的光线通过相机模型成为图片上…

Jmeter性能测试之阶梯式场景、波浪式场景

&#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 1 阶梯式场景&#xff08;负载测试&#xff09;  该场景主要应用在负载测试里面&#xff0c;通过设定一定的并发线程数&#xff0c;给定加压规则&#xff0c;…

windows 上面交叉编译 适合arm架构上的linux内核系统的qt 版本,源码编译

1. 在机器上确认系统信息 cat /proc/cpuinfomodel name : ARMv7 Processor rev 5 (v7l) arm 32位 BogoMIPS : 57.14 Features : swp half thumb fastmult vfp edsp neon vfpv3 tls vfpv4 idiva idivt vfpd32 CPU implementer : 0x41 CPU architecture: 7 …

实战华为AC6508无线控制器+华为无线AP上线配置(AirEngine5762S-12+AirEngine5760-10)+无线WIFI配置

一、适用场景 1、适用于企业环境、校园环境、大户型家庭多层楼环境。 2、对于无线网络需要集中管理和监测的环境&#xff0c;无线wifi覆盖范围面积大&#xff0c;适用本实例。 3、当无线WIFI需要从一个区域到另一个区域无缝漫游时&#xff0c;确保应用不掉线&#xff0c;可使用…

MS41929双通道超低噪声 256 细分微步进低压电机驱动

MS41929 是一款双通道 5V 低压步进电机驱动芯片&#xff0c;通过 具有电流细分的电压驱动方式以及扭矩纹波修正技术&#xff0c;实现了 超低噪声微步进驱动。 芯片另外内置一个直流电机驱动器&#xff0c;上下开关的电阻之和 低至 1.1Ω 。 MS41929 内置了晶振放大模…

PostgreSQL Windows系统初始化、登录、创建用户及数据库

文章目录 PostgreSQL初始化PostgreSQL登录PostgreSQL初始化 initdb 到安装目录下,找到目录E:\postgresql\bin(自己的安装目录),在该目录下使用管理员方式打开cmd窗口。initdb.exe -D "E:\postgresql\bin" E:\postgresql\bin>initdb.exe -D "E:\postgresq…

WPF实现类似网易云音乐的菜单切换

这里是借助三方UI框架实现了&#xff0c;感兴趣的小伙伴可以看一下。 深色模式&#xff1a;​ 浅色模式&#xff1a; ​这里主要使用了以下三个包&#xff1a; MahApps.Metro&#xff1a;UI库&#xff0c;提供菜单导航和其它控件​​​​​​​ 实现步骤&#xff1a;1、使用B…

【KEIL那些事 4】CMSIS缺失!!!!导致不能编译!!!!软件自带芯片下载缓慢!!!!!!快速下载芯片包!!!!!

安装了keli发现emmm&#xff0c;CMSIS缺失&#xff01;&#xff01;&#xff01;&#xff01;不能编译&#xff0c;&#xff0c;&#xff0c;自带下载芯片缓慢&#xff0c;&#xff0c;&#xff0c;官网下载emmm&#xff0c;竟然不带动的&#xff01;&#xff01;&#xff01;&…

打开游戏提示丢失(或找不到)XINPUT1_3.DLL的多种解决办法

xinput1_3.dll是一个动态链接库&#xff08;DLL&#xff09;文件&#xff0c;它在Windows操作系统中扮演着重要的角色。该文件作为系统库文件&#xff0c;通常存放于C:\Windows\System32目录下&#xff08;对于32位系统&#xff09;或C:\Windows\SysWOW64目录下&#xff08;对于…

移动管家摩托车一键启动系统功能特点

移动管家摩托车一键启动系统具备智能解锁、启动、熄火及防盗等多功能 智能解锁与启动 无需原车钥匙&#xff0c;携带感应器走近摩托车即可自动解锁&#xff0c;按下一键启动按钮即可点火启动摩托车。智能熄火与防盗 摩托车熄火后&#xff0c;系统自动进入防盗模式&#xff0c;…

探索网页组件化:原生JavaScript动态加载HTML与iframe的使用与比较

在网页设计中&#xff0c;将内容作为组件动态加载到页面上是一种提高用户体验和页面性能的有效手段。本文将详细介绍两种实现动态内容加载的方法&#xff1a;使用原生JavaScript动态加载HTML和使用iframe&#xff0c;并对比它们的使用方式和优缺点。 原生JavaScript动态加载HTM…

落地 ZeroETL 轻量化架构,ByteHouse 推出“四个一体化”策略

在数字化转型的浪潮中&#xff0c;数据仓库作为企业的核心数据资产&#xff0c;其重要性日益凸显。随着业务范围扩大&#xff0c;企业也会使用不同的数据仓库来管理、维护相关数据。研发人员需要花费大量时间和精力&#xff0c;从中导出数据&#xff0c;然后进行手动整理、转换…

【SpringBoot】16 文件上传(Thymeleaf + MySQL)

Gitee仓库 https://gitee.com/Lin_DH/system 介绍 文件上传是指将本地的图片、视频、音频等文件上传到服务器&#xff0c;供其他用户浏览下载的过程&#xff0c;文件上传在日常项目中用的非常广泛。 实现代码 第一步&#xff1a;在配置文件新增如下配置 application.yml s…

【python】疑难-调用某函数时报got multiple values for argument ‘curdate‘

【分析】 最简单的原因就是参数重名。 比较隐藏的原因就是参数位置错位也可能报这个错。特别是位置参数的情况。 【方法】 如果检查发现没有重名参数&#xff0c;那就好好对比实参和形参的位置是否有错位等。

【图像去噪】论文精读:CycleISP: Real Image Restoration via Improved Data Synthesis

请先看【专栏介绍文章】:【图像去噪(Image Denoising)】关于【图像去噪】专栏的相关说明,包含适配人群、专栏简介、专栏亮点、阅读方法、定价理由、品质承诺、关于更新、去噪概述、文章目录、资料汇总、问题汇总(更新中) 文章目录 前言Abstract1. Introduction2. Related…

线性可分支持向量机的原理推导【补充知识部分】9-11极小极大化问题 公式解析

本文是将文章《线性可分支持向量机的原理推导》中的公式单独拿出来做一个详细的解析&#xff0c;便于初学者更好的理解。在主文章中&#xff0c;有一个部分是关于补充拉格朗日对偶性的相关知识&#xff0c;此公式即为这部分里的内容。 公式 9-11 是通过引入拉格朗日乘子法将一个…

渗透实战 JS文件怎么利用

1.前言 关于JS在渗透测试中的关键作用&#xff0c;想必不用过多强调&#xff0c;在互联网上也有许多从JS中找到敏感信息从而拿下关键系统的案例。大部分师傅喜欢使用findsomething之类的浏览器插件&#xff0c;也有使用诸如Unexpected.information以及APIFinder之类的Burp插件…

Elasticsearch 在linux部署 及 Docker 集群部署详解案例示范

1. 在 CentOS 上安装和配置 Elasticsearch 在 CentOS 系统下&#xff0c;安装 Elasticsearch 主要分为以下步骤&#xff1a; 1.1 准备工作 在开始安装之前&#xff0c;确保你的系统满足以下基本条件&#xff1a; CentOS 版本要求&#xff1a;推荐使用 CentOS 7 及以上版本。…

02_MVCC-版本链管理

MVCC-版本链管理 文章目录 MVCC-版本链管理简介基本概念版本链的形成与管理数据插入操作数据更新操作数据删除操作 一致性视图&#xff08;Read View&#xff09;快照读与当前读快照读&#xff08;Snapshot Read&#xff09;当前读&#xff08;Current Read&#xff09; 优缺点…