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

devtools/2024/10/25 0:26:26/

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.ppmy.cn/devtools/128545.html

相关文章

数据结构 —— 链式二叉树(C语言讲解)

目录 0.前言 1.链式存储的二叉树 2.二叉树的遍历 二叉树的前、中、后序遍历 前序遍历 中序遍历 后序遍历 二叉树的层序遍历 3.二叉树的其他操作 二叉树的结点个数 二叉树叶子结点个数 二叉树第k层结点个数 二叉树查找值为x的节点 二叉树的高度 判断二叉树是否是…

【mysql进阶】2-4. mysql 系统库

mysql System Schema (mysql系统库) Mysql Schema是⼀个系统库&#xff0c;表中存储了MySQL服务器运⾏时所需的信息。⼴义上&#xff0c;mysqlschema包含存储数据库对象元数据的数据字典和⽤于其他操作⽬的的系统表。数据字典表和系统表位于数据⽬录下⼀个名为 mysql.ibd 的表…

【MySQL】详解MySQL数据类型

一、数据类型 各类型的数值范围&#xff1a; 在MySQL中&#xff0c;整型可以指定是有符号的和无符号的&#xff0c;默认是有符号的。 可以通过UNSIGNED来说明某个字段是无符号的。对于int类型可能存放不下的数据&#xff0c;尽量不使用unsigned&#xff0c;unsigned int 同样可…

Rust编程语言变量的所有权(ownership)

文章目录 什么是所有权所有权规则转让所有权变量与数据交互的方式(一):移动变量与数据交互的方式(二):克隆只在栈上的数据:拷贝所有权与函数返回值与作用域引用和借用可变引用悬垂引用(Dangling References)引用的规则什么是所有权 所有权(ownership)是Rust 的核心功能之一…

GISBox vs CesiumLab:哪款GIS工具更适合你的项目?

在地理信息系统&#xff08;GIS&#xff09;领域&#xff0c;越来越多的用户开始关注GIS工具箱的选择&#xff0c;其中GISBox和CesiumLab是两款备受推崇的产品。那么&#xff0c;哪一款更适合你的需求呢&#xff1f;本文将从功能、使用体验和应用场景等方面&#xff0c;对GISBo…

怎么快速在ppt中添加文本框?2个常用的ppt使用技巧盘点!

文本是ppt中最基本的元素&#xff0c;也是我们呈现想法和观点最常使用的媒介&#xff0c;想在ppt中添加文本&#xff0c;必然离不开文本框&#xff0c;那ppt如何添加文本框呢&#xff1f; 对于Powerpoint&#xff08;简称ppt&#xff09;而言&#xff0c;可以点击菜单栏的 “插…

智慧升级,知识无界:十大搭建知识库软件助你前行

在知识爆炸的时代&#xff0c;如何高效地管理、整合与利用信息&#xff0c;成为了个人与企业发展的核心竞争力。智慧升级&#xff0c;意味着我们不仅要掌握丰富的知识&#xff0c;更要学会运用工具&#xff0c;让知识无界流通&#xff0c;助力个人成长与企业创新。以下是精心挑…

制作sdk

制作 java-sdk 的两种方式_java sdk-CSDN博客 平时maven工程里 pom 中的引用的依赖就是别人开发好的 sdk 包&#xff1b;工作中为了方便一些开发也需要自定义开发 sdk 包&#xff0c; 精华&#xff1b; 一、两种方式 我们平时引用 sdk 有两种方式&#xff1a; pom 依赖引用…