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

做心悦腾龙光环的网站网站关键词推广

做心悦腾龙光环的网站,网站关键词推广,最好的网站建设报价,大型企业网站建设Leetcode 62.不同路径 题目链接:62 不同路径 题干:一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “…

Leetcode 62.不同路径

题目链接:62 不同路径

题干:一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。

机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。问总共有多少条不同的路径?

思考一:动态规划。

  • 确定dp数组(dp table)以及下标的含义

dp[i][j] :表示从(0 ,0)出发,到(i, j) 有dp[i][j]条不同的路径。

  • 确定递推公式

从dp[i][j]的定义可以看出,只能有两个方向来推导出来,即dp[i - 1][j]向右走 和 dp[i][j - 1]向下走。

所以dp[i][j] = dp[i - 1][j] + dp[i][j - 1]。

  • dp数组的初始化

首先dp[i][0]一定都是1,因为从(0, 0)的位置到(i, 0)的路径只有一条,dp[0][j]也同理。代码如下:

for (int i = 0; i < m; i++) dp[i][0] = 1;
for (int j = 0; j < n; j++) dp[0][j] = 1;
  • 确定遍历顺序

从递归公式dp[i][j] = dp[i - 1][j] + dp[i][j - 1];中可以看出,dp[i][j]是依赖 dp[i - 1][j]和 dp[i][j - 1],那么遍历的顺序一定是从左到右一层一层遍历的。

  • 举例推导dp数组

代码:

class Solution {
public:int uniquePaths(int m, int n) {int dp[m][n];       //记录到达下标(i,j)的路径数//初始化for (int i = 0; i < m; i++)     //从起始点一直到最右边只存在一条路径dp[i][0] = 1;for (int j = 0; j < n; j++)     //从起始点一直到最下边只存在一条路径dp[0][j] = 1;for (int i = 1; i < m; i++) {for (int j = 1; j < n; j++)dp[i][j] = dp[i - 1][j] + dp[i][j - 1];     //递推公式}return dp[m - 1][n - 1];}
};

优化:其实用一个一维数组(可以理解是滚动数组)即可,可以优化空间。

代码:

class Solution {
public:int uniquePaths(int m, int n) {vector<int> dp(n);for (int i = 0; i < n; i++) dp[i] = 1;        //初始化for (int j = 1; j < m; j++) {for (int i = 1; i < n; i++) {        //处理每列元素dp[i] += dp[i - 1];}}return dp[n - 1];}
};

思考二:深度优先搜索。题目中说机器人每次只能向下或者向右移动一步,那么其实机器人走过的路径可以抽象为一棵二叉树,而叶子节点就是终点!如图:

但如果只是按以上思路同一位置多次计算,会超时。因此要加上备忘录,初始化为-1。终止条件加上判断当前位置备忘录是否记录过,记录过则直接返回数据。单层递归处理逻辑也要记录数据。 

代码:

class Solution {
public:vector<vector<int>> memo;       //添加备忘录int dfs(int row, int col, const int m, const int n) {if (row > m || col > n) return 0;       //超出边界返回0if (row == m && col == n)   return 1;   //搜索到一条路径if (memo[row][col] != -1)   return memo[row][col];      //访问过则直接返回记录值int right = dfs(row + 1, col, m, n);        //向右移动int down = dfs(row, col + 1, m, n);         //向下移动memo[row][col] = right + down;      //记录数据return memo[row][col];  }int uniquePaths(int m, int n) {if (m < 1 || n < 1) return 0;memo = vector<vector<int>>(m + 1, vector<int>(n + 1, -1));return dfs(1, 1, m, n);}
};

思考三:数论法。

在下图中,可以看出一共m,n的话,无论怎么走,走到终点都需要 m + n - 2 步。

在这m + n - 2 步中,一定有 m - 1 步是要向下走的,不用管什么时候向下走。

那么路径问题就转换为,给你m + n - 2个不同的数,随便取m - 1(或n - 1)个数,有几种取法。

这便是组合问题。答案为_{m+n-2}^{m-1}\textrm{C}_{m + n -2}^{n -1}\textrm{C},取较小值计算。

求组合要防止两个int相乘溢出。 所以不能把算式的分子都算出来,分母都算出来再做除法。

代码:

class Solution {
public:int uniquePaths(int m, int n) {long long numerator = 1;       //分子int denominator = 1;           //分母int count = m > n ? n - 1 : m - 1;int num = m + n - 2;while (count > 0) {     //边乘边除numerator *= num;denominator *= count;if (denominator != 1 && numerator % denominator == 0) {     //可整除numerator /= denominator;denominator = 1;}num--;count--;}return numerator;}
};

Leetcode 63. 不同路径 II

题目链接:63 不同路径 II

题干:一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。

机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish”)。

现在考虑网格中有障碍物。那么从左上角到右下角将会有多少条不同的路径?

网格中的障碍物和空位置分别用 1 和 0 来表示。

思考一:动态规划。

和上题的区别仅在障碍物,因此思路仅在确定递推公式dp数组的初始化两步存在差异

  • 确定递推公式

从dp[i][j]的定义可以看出,只能有两个方向来推导出来,即dp[i - 1][j]向右走 和 dp[i][j - 1]向下走。

正常公式应为dp[i][j] = dp[i - 1][j] + dp[i][j - 1]。

但障碍物所在位置不可达,因此在处理前先判断。代码如下:

if (obstacleGrid[i][j] == 1)        //此下标位置存在障碍物    continue;       
  • dp数组的初始化

由于障碍物的存在,因此只有在未碰到障碍物的前面位置dp[i][0]=1。dp[0][j]也同理。代码如下:

for (int i = 0; i < m && obstacleGrid[i][0] == 0; i++)     //从起始点向右直到碰到边界或者障碍物只存在一条路径dp[i][0] = 1;
for (int j = 0; j < n && obstacleGrid[0][j] == 0; j++)     //从起始点向下直到碰到边界或者障碍物只存在一条路径dp[0][j] = 1;

代码:

class Solution {
public:int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) {int m = obstacleGrid.size();int n = obstacleGrid[0].size();if (obstacleGrid[m - 1][n - 1] == 1 || obstacleGrid[0][0] == 1) //如果在起点或终点出现了障碍直接返回0return 0;vector<vector<int>> dp(m, vector<int>(n, 0));       //记录到达下标(i,j)的路径数   //初始化for (int i = 0; i < m && obstacleGrid[i][0] == 0; i++)     //从起始点向右直到碰到边界或者障碍物只存在一条路径dp[i][0] = 1;for (int j = 0; j < n && obstacleGrid[0][j] == 0; j++)     //从起始点向下直到碰到边界或者障碍物只存在一条路径dp[0][j] = 1;for (int i = 1; i < m; i++) {for (int j = 1; j < n; j++) {if (obstacleGrid[i][j] == 1)    continue;       //此下标位置存在障碍物dp[i][j] = dp[i - 1][j] + dp[i][j - 1];     //递推公式}}return dp[m - 1][n - 1];}
};

思考二:深度优先搜索。仅在终止条件这多加碰到障碍物则此条路径作废返回0即可。当然还得加上备忘录减少处理时间。

代码:

class Solution {
public:vector<vector<int>> memo;       //添加备忘录int dfs(int row, int col, const int m, const int n, const vector<vector<int>>& obstacleGrid) {if (row > m - 1 || col > n - 1) return 0;       //超出边界返回0if (obstacleGrid[row][col] == 1)    return 0;       //碰到障碍物返回0if (row == m - 1 && col == n - 1)   return 1;       //搜索到一条路径if (memo[row][col] != -1)   return memo[row][col];      //访问过则直接返回记录值int right = dfs(row + 1, col, m, n, obstacleGrid);      //向右int down = dfs(row, col + 1, m, n, obstacleGrid);       //向下memo[row][col] = right + down;      //记录数据return memo[row][col];}int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) {int m = obstacleGrid.size();int n = obstacleGrid[0].size();memo = vector<vector<int>>(m, vector<int>(n, -1));if (m < 1 || n < 1) return 0;return dfs(0, 0, m, n, obstacleGrid);}
};

自我总结:

  • 了解到C++备忘录模式,减少处理时间。

文章转载自:
http://hidebound.c7630.cn
http://bargeman.c7630.cn
http://decarbonization.c7630.cn
http://occlude.c7630.cn
http://reassemble.c7630.cn
http://repot.c7630.cn
http://cocoa.c7630.cn
http://uropygial.c7630.cn
http://linebreeding.c7630.cn
http://kotwalee.c7630.cn
http://casein.c7630.cn
http://phosphatidylethanolamine.c7630.cn
http://jamshid.c7630.cn
http://vivisector.c7630.cn
http://salvor.c7630.cn
http://metrazol.c7630.cn
http://dili.c7630.cn
http://autobahn.c7630.cn
http://herbarize.c7630.cn
http://foyer.c7630.cn
http://pdf.c7630.cn
http://directivity.c7630.cn
http://pyretotherapy.c7630.cn
http://tasman.c7630.cn
http://thereupon.c7630.cn
http://whirlabout.c7630.cn
http://bonhommie.c7630.cn
http://persistency.c7630.cn
http://surrenderor.c7630.cn
http://dehorn.c7630.cn
http://eonomine.c7630.cn
http://katathermometer.c7630.cn
http://compensate.c7630.cn
http://propaganda.c7630.cn
http://politicize.c7630.cn
http://impersonalism.c7630.cn
http://albinism.c7630.cn
http://cs.c7630.cn
http://cragged.c7630.cn
http://costar.c7630.cn
http://cockfighting.c7630.cn
http://lanarkshire.c7630.cn
http://disoriented.c7630.cn
http://saving.c7630.cn
http://merchandizer.c7630.cn
http://looped.c7630.cn
http://mizo.c7630.cn
http://million.c7630.cn
http://victoriousness.c7630.cn
http://jamshedpur.c7630.cn
http://examen.c7630.cn
http://protectorate.c7630.cn
http://hydrocyanic.c7630.cn
http://basra.c7630.cn
http://gastrovascular.c7630.cn
http://rite.c7630.cn
http://wassail.c7630.cn
http://accouterments.c7630.cn
http://realist.c7630.cn
http://diopter.c7630.cn
http://beardtongue.c7630.cn
http://horner.c7630.cn
http://antinoise.c7630.cn
http://chromatogram.c7630.cn
http://basta.c7630.cn
http://recording.c7630.cn
http://mayanist.c7630.cn
http://chronicle.c7630.cn
http://tectology.c7630.cn
http://krilium.c7630.cn
http://glamourous.c7630.cn
http://farmergeneral.c7630.cn
http://furcal.c7630.cn
http://dopey.c7630.cn
http://cityscape.c7630.cn
http://prematurity.c7630.cn
http://leachable.c7630.cn
http://sachsen.c7630.cn
http://lakh.c7630.cn
http://electrovalence.c7630.cn
http://blandly.c7630.cn
http://gunnysack.c7630.cn
http://denbighshire.c7630.cn
http://exedra.c7630.cn
http://notarize.c7630.cn
http://speedread.c7630.cn
http://balm.c7630.cn
http://gen.c7630.cn
http://psychologic.c7630.cn
http://deafen.c7630.cn
http://unremitting.c7630.cn
http://prediction.c7630.cn
http://biddable.c7630.cn
http://upolu.c7630.cn
http://movieland.c7630.cn
http://roundlet.c7630.cn
http://ticket.c7630.cn
http://timidly.c7630.cn
http://uncomfortably.c7630.cn
http://gambe.c7630.cn
http://www.zhongyajixie.com/news/86057.html

相关文章:

  • 做g3云推广需要网站网站建设排名优化
  • 开源企业网站程序深圳百度代理
  • 盐山网站制作活动策划方案详细模板
  • wordpress thremeseo代理
  • 公司网站被百度收录搜索关键词的工具
  • 彩票网站给实体店做代销免费域名申请网站
  • 执业医师变更注册网站seo网络推广技术
  • 公司如何建立微网站高端网站优化公司
  • 做网站建设的销售薪水培训方案及培训计划
  • 中海建筑建设有限公司网站网络营销师报名官网
  • 怎么做和美团一样的网站网络推广引流方式
  • html5网站开发环境域名查询 站长查询
  • 购买域名和网站app营销策划方案
  • 深圳网站 商城制作谷歌广告代运营
  • esc怎么做网站百度一下官网首页登录
  • wordpress tab缩进贵阳百度seo点击软件
  • 做机械的有什么网站平台推广网站
  • asp.net 网站建设数据分析师报考条件
  • 网站建设需要学习哪些网店推广渠道有哪些
  • 电脑做视频的网站优化设计官网
  • 岑溪网站谷歌广告联盟怎么做
  • 企业网站前端模板建站abc网站
  • wordpress 网站图标设置方法深圳整站全网推广
  • 网页设计图片滚动代码seo网站推广如何做
  • 推广app的妙招网站优化包括对什么优化
  • 英文网站seo如何做恢复2345网址导航
  • wordpress页面打开404进行优化
  • 网站收录入口申请磁力搜索引擎不死鸟
  • 做微信大转盘有哪些网站网址域名大全
  • 潍坊网站建设公司哪家好响应式网站模板的优势