动态规划I (45、55、62、63)

news/2025/3/7 0:57:34/

按顺序刷确实效率太低了,今天开始要按顺序的同时也按标题来了,全面加油!这种应该以后会更多直接总结题解了,自我学习用,全靠大佬,贴贴!!含45、55、62、63

CP55 跳跃游戏

题目描述:

给定一个非负整数数组 nums ,你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。判断你是否能够到达最后一个下标。

题解:

class Solution {
public:bool canJump(vector<int>& nums) {int n = nums.size();int rightmost = 0;for (int i = 0; i < n; ++i) {if (i <= rightmost) {rightmost = max(rightmost, i + nums[i]);if (rightmost >= n - 1) {return true;}}}return false;}
};

大佬!:

 按这个思路去写,结果超时...我的问题在于,本题需要的是最后一个格子可不可以,我们只需要找到每次跳得最远得地方,我这里定义了一个数组tmp存储每一个地方能不能被跳到,但是这是完全没有用得,更远得能被跳到,那后面得一定可以跳到,无需维护这个数组,只需要记录最远可以跳到得地方。

//我写的超时破代码
class Solution {
public:bool canJump(vector<int>& nums) {int length=nums.size();vector<bool> tmp(length);tmp[0]=true;for(int i=0;i<length;i++){if(tmp[i]==true){int n=nums[i];for(int j=1;j<=n;j++){if(i+j<length){tmp[i+j]=true;}}}}return tmp[length-1];}
};
//大佬代码
class Solution {
public:bool canJump(vector<int>& nums) {int k = 0;for (int i = 0; i < nums.size(); i++) {if (i > k) return false;k = max(k, i + nums[i]);}return true;}
};

CP45 跳跃游戏II

题目描述:

给定一个长度为 n 的 0 索引整数数组 nums。初始位置为 nums[0]。每个元素 nums[i] 表示从索引 i 向前跳转的最大长度。换句话说,如果你在 nums[i] 处,你可以跳转到任意 nums[i + j] 处:0 <= j <= nums[i] 且 i + j < n。返回到达 nums[n - 1] 的最小跳跃次数。生成的测试用例可以到达 nums[n - 1]。注:题目保证可以到达 nums[n-1]

学习记录:

有了第一题的想法,我们只需要不断判断每次的最小步数就行了,初步想法是定义一个储存最小步数的数组,然后不断更新。一道典型的动态规划

//我的思路
class Solution {
public:int jump(vector<int>& nums) {int length=nums.size();vector<int> tmp(length);//存储最少跳数 for(int i=0;i<length;i++) tmp[i]=length;tmp[0]=0;for(int i=0;i<length;i++){int n=nums[i];for(int j=1;j<=n;j++){if(i+j<length){tmp[i+j]=min(tmp[i+j],tmp[i]+1);//这里第一次写成tmp[i]+j了,但是每次只需要加1跳就行}}}return tmp[length-1];}
};

题解:

1.正向分析法

其实我们也用了正向分析法,但是正如第一题提到的问题,所有后面能到达的前面也能,同理不用多维护一个数组,在本题,最后一个点一定能到,也就是说这个数组中所有点都是能到的。所以我每次只需要:我们维护当前能够到达的最大下标位置,记为边界。我们从左到右遍历数组,到达边界时,更新边界并将跳跃次数增加 1。比我们的方案难理解一点,maxPos:目前能跳到的最远位置;end:上次可跳跃的右边界

 

class Solution {
public:int jump(vector<int>& nums) {int maxPos = 0, n = nums.size(), end = 0, step = 0;for (int i = 0; i < n - 1; ++i) {maxPos = max(maxPos, i + nums[i]);if (i == end) {end = maxPos;++step;}}return step;}
};

2.反向分析法

C++实现超时间了,就学习一下思想,给出java实现的代码

class Solution {public int jump(int[] nums) {int position = nums.length - 1;int steps = 0;while (position > 0) {for (int i = 0; i < position; i++) {if (i + nums[i] >= position) {position = i;steps++;break;}}}return steps;}
}

CP62 不同路径

题目描述:

 

学习记录:

典型动态规划,维护一个数组,记录路径数即可。

class Solution {
public:int uniquePaths(int m, int n) {int tmp[m][n];for(int i=0;i<m;i++){tmp[i][0]=1;}for(int j=0;j<n;j++){tmp[0][j]=1;}for(int i=1;i<m;i++){for(int j=1;j<n;j++){tmp[i][j]=tmp[i-1][j]+tmp[i][j-1];}}return tmp[m-1][n-1];}
};

题解:

除了上述方法,还有一种

python中存在API:

def uniquePaths(self, m: int, n: int) -> int:return int(math.factorial(m+n-2)/math.factorial(m-1)/math.factorial(n-1))作者:powcai

CP63 不同路径II

题目描述:

学习记录:

和上述思路一样,只是多加了一个判断,如果有石头就不能走,没啥好说的,写

class Solution {
public:int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) {int m=obstacleGrid.size();int n=obstacleGrid[0].size();int tmp[m][n];int flag=1;for(int i=0;i<m;i++){if(obstacleGrid[i][0]==1) flag=0;if(flag) tmp[i][0]=1;else tmp[i][0]=0;}flag=1;for(int j=0;j<n;j++){if(obstacleGrid[0][j]==1) flag=0;if(flag) tmp[0][j]=1;else tmp[0][j]=0;}for(int i=1;i<m;i++){for(int j=1;j<n;j++){tmp[i][j]=tmp[i-1][j]+tmp[i][j-1];if(obstacleGrid[i][j]==1) tmp[i][j]=0;}}return tmp[m-1][n-1];}
};

注:定义可以这样定义:vector<vector<int>> tmp(m,vector<int>(n));

 

PS:

由于leetcode比较智能允许int t[m][n]这种形式,但是VS2010不行,需要方法如下:

#include <iostream>   
#include <string>
#include <iomanip>
using namespace std;void find(int m,int n)
{int *m1=new int [m];for(int i=0;i<m;i++)m1[i]=0;cout<<"m1: "<<m1[0]<<endl;delete m1;int **m2=new int* [m];for(int i=0;i<m;i++)m2[i]=new int [n];for(int i=0;i<m;i++)for(int j=0;j<n;j++)m2[i][j]=1;cout<<"m2: "<<m2[0][0]<<endl;for(int i=0;i<m;i++) delete m2[i];
}int main()
{int m=2;int n=3;find(m,n);system("pause");return 0;
}


http://www.ppmy.cn/news/322305.html

相关文章

(详细)华为畅享6S DIG-AL00的usb调试模式在哪里打开的教程

当我们使用pc链接安卓手机的时候&#xff0c;如果手机没有开启usb调试模式&#xff0c;pc则没法成功读到我们的手机&#xff0c;有时候&#xff0c;我们使用的一些功能较强的工具好比以前我们使用的一个工具引号精灵&#xff0c;老版本就需要打开usb调试模式下使用&#xff0c;…

CF卡规格说明书(英)

CF卡规格说明书(英) 作者&#xff1a;CF Association 来源&#xff1a;biplip 下载>> The information in this specification is subject to change without notice. Use of this specification for product design requires an executed license agreement fro…

dell服务器怎么看阵列卡型号,DELL服务器的各种RAID卡的详细参数..doc

DELL服务器的各种RAID卡的详细参数. 文包含如下内容   一、Dell服务器 RAID卡介绍   二、阵列卡的Stripe size介绍   三、megacli介绍、安装、使用、crontab监控脚本   四、查看SAS 6/iR卡的信息   五、DELL服务器的各种RAID卡的详细参数 以下在系统下使用相关命令得…

SD卡寄存器及对应的CMD命令描述

目录 1.SD卡寄存器 1.1操作条件寄存器——OCR 1.2卡识别寄存器——CID 1.3特定数据寄存器——CSD 1.4相对地址寄存器——RCA 1.5驱动阶段寄存器——DSR 1.6SD配置寄存器——SCR 1.7SD状态寄存器——SSR 1.8卡状态寄存器——CSR 1.9.SD卡存储器 2.SD卡对应的CMD命令 …

SD卡命令详解

目录 01、SD卡简介 02、SD卡特点 03、SD的寄存器 04、SD卡的操作 4.1、SD的初始化 4.2、SD卡读操作 4.3、SD卡写操作 01、SD卡简介 SD卡&#xff08;SecureDigital MemoryCard&#xff09;即&#xff1a;安全数码卡&#xff0c;它是在MMC的基础上发展而来&#xff0c;是…

银联IC卡读卡流程详解--读卡器与卡交互指令

最近因研究了下银联借记/贷记应用卡片规范&#xff0c;发现网上可参考资源较少&#xff0c;于是萌生了写下这篇文字的想法&#xff0c;希望可以帮助到有需要的兄弟姐妹&#xff0c;有描述不清晰或者有错误的地方欢迎指正。 下面进入正题&#xff0c;测试使用的卡是招商银行的IC…

CF卡的基础知识

CF卡的基础知识 CF卡的物理和硬件接口特性 CF卡可以工作在PC卡ATA I/O模式、PC卡ATA存储模式和实IDE模式三种模式下&#xff0c;实IDE模式与IDE接口完全歉。CF卡遵从ATA协议&#xff0c;属于块存储设备&#xff0c;存储单元是通过磁头&#xff08;head&#xff09;、柱面&…

ID卡读卡函数

QQ&#xff1a;954486673 微信&#xff1a;13822155058 淘宝&#xff1a;https://item.taobao.com/item.htm?spma1z10.5-c.w4002-17663462238.20.6d605b432pyRam&id562957272162 OUR_IDR.dll动态库使用说明 一、 动态库简介 动态库OUR_IDR.dll用VC6.0开发&#xff0c;编译…