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

拖鞋设计网站推荐北京网站优化推广公司

拖鞋设计网站推荐,北京网站优化推广公司,ie浏览器手机版下载,wordpress收藏插件题目 给定一个二维数组matrix[][],一个人必须从左上角出发,最终到达右下角,沿途只可以向下或者向右走,沿途的数字都累加就是距离累加和。返回最小距离累加和。 这道题中会采用压缩数组的算法来进行优化 暴力递归 暴力递归方法的整…

题目
给定一个二维数组matrix[][],一个人必须从左上角出发,最终到达右下角,沿途只可以向下或者向右走,沿途的数字都累加就是距离累加和。返回最小距离累加和。
这道题中会采用压缩数组的算法来进行优化

暴力递归
暴力递归方法的整体思路是根据小人所在的位置(当前值),通过向下传递(向左走向右走)来获取最终选择路径的最小值。
所以base case可以确定:

  1. 如果小人走到了最后一行,那么接下来就只能向下走。
  2. 如果小人走到了最后一列,那么接下来就只能向左走。
  3. 如果小人走到了matrix[][]的最后一个格子,返回当前值给上层做处理,取最小值。
  4. 否则,既可以向左也走可以向右走,并获取最小值。

所以暴力递归的方法就出来了。

public static int minPathSum1(int[][] matrix) {if (null == matrix || matrix.length == 0 || matrix[0] == null || matrix[0].length == 0) {return -1;}int row = matrix.length;int col = matrix[0].length;return process(row - 1, col - 1, 0, 0, matrix);}//返回 matrix[i...][j....] 位置的最小值。public static int process(int row, int col, int curRow, int curCol, int[][] matrix) {//当走到最后一个位置,返回matrix中最后一个位置的值if (curRow == row && curCol == col) {return matrix[row][col];}//走到最后一行,只能往右走,只能向右累加if (curRow == row) {return matrix[curRow][curCol] + process(row, col, curRow, curCol + 1, matrix);}//走到最后一列,只能向下走if (curCol == col) {return matrix[curRow][curCol] + process(row, col, curRow + 1, curCol, matrix);}//否则,可以向右走,可以向下走,进行累加。int curValue = matrix[curRow][curCol];int p1 = curValue + process(row, col, curRow + 1, curCol, matrix);int p2 = curValue + process(row, col, curRow, curCol + 1, matrix);return Math.min(p1, p2);}

动态规划
这道题的动态规划也不难,给定的是一个二维数组matrix[][],每次行和列会进行变化(可变参数),所以可以创建一个和matrix大小相等的dp[][]来存放每一步计算的值。
因为只可以向下走或向右走,所以dp中任选一个格子的依赖是依赖自己的左侧的值和上面的值。其中dp中第一行的值只会依赖同行左侧的值,dp中第一列的值只会依赖同一列上面的值
所以先将dp中第一行和第一列的值填充好后,其余的按照依赖关系填充,即可完善dp表。

代码

 public static int dp(int[][] matrix) {if (null == matrix || matrix.length == 0 || matrix[0] == null || matrix[0].length == 0) {return -1;}int row = matrix.length;int col = matrix[0].length;int[][] dp = new int[row][col];dp[0][0] = matrix[0][0];for (int i = 1; i < col; i++) {dp[0][i] = dp[0][i - 1] + matrix[0][i];}for (int j = 1; j < row; j++) {dp[j][0] = dp[j - 1][0] + matrix[j][0];}for (int i = 1; i < row; i++) {for (int j = 1; j < col; j++) {dp[i][j] = Math.min(dp[i - 1][j], dp[i][j - 1]) + matrix[i][j];}}return dp[row - 1][col - 1];}

优化
动态规划方法中是创建了一个和matrix[][]大小相等的dp表,通过填充dp表来完善的代码。

如果给定的matrix[][]太大了,是不是我的dp表也要跟着很大,并且,在填充dp表时,第三行依赖第二行的值,第四行依赖第三行的值,此时。第二行的值就已经没有用了,不再需要它了,所以是不是只需要一个跟matrix[][]中列的长度相等的一维数组arr[]就够了。

先根据matrix[][]中第0行的值填充arr[],下面的两层循环中,最外层循环会让arr[0]每次加matrix中当行行的第一个值(因为只依赖上面)。内层循环,会找需要依赖的上面值(arr[j])和左边值(arr[j - 1])来取最小值,后加上matrix中当前位置上的值。

代码

 public static int minPathSum2(int[][] matrix) {if (matrix == null || matrix.length == 0 || matrix[0] == null || matrix[0].length == 0) {return 0;}int row = matrix.length;int col = matrix[0].length;int[] arr = new int[col];arr[0] = matrix[0][0];//根据matrix第一行的值填充arrfor (int i = 1; i < col; i++) {arr[i] = arr[i - 1] + matrix[0][i];}for (int i = 1; i < row; i++) {arr[0] += matrix[i][0];for (int j = 1; j < col; j++) {//arr[j - 1] : 相当于我依赖的左边//arr[j]  : 因为此时arr[j]的值还没修改,还是上一行的值,相当于自己的上面。 arr[j] = Math.min(arr[j - 1], arr[j]) + matrix[i][j];}}return arr[col - 1];}
http://www.khdw.cn/news/44591.html

相关文章:

  • vultr 搭建wordpress百度seo排名优化排行
  • seo顾问服务 品达优化手机网站搜索优化
  • 网站建设专员百度seo优化培训
  • 大连住建部官方网站百度搜索趋势
  • 常州网站开发信息流优化师前景
  • 苏州网站建设技术seo网络优化教程
  • 黄冈商城网站建设哪家好360免费建站网页链接
  • 手机网站建设 广州体验式营销经典案例
  • 做的网站上传到服务器吗长沙搜索排名优化公司
  • 业务网站风格模板seo代码优化包括哪些
  • 前端做项目网站百度指数名词解释
  • 福州专业网站建设网络公司怎么做电商卖东西
  • 做彩票网站电话多少钱宣传推广方式有哪些
  • 南京网站优化哪家好优化网站页面
  • 可以做设计的网站有哪些全自动引流推广软件
  • 企业形象设计vi手册seo搜索引擎优化就业指导
  • 论坛网站推广方案可以免费发广告的网站
  • 西安有那些做网站的公司长尾关键词在线查询
  • 网站建设模块方案做个小程序需要花多少钱
  • 邮件网站怎么做百度客服号码
  • 企业网站ui模板下载友情链接的形式
  • 为什么建设网站很多公司没有软文是什么意思?
  • 西宁做网站建设公司电话营销技巧和营销方法
  • 芜湖哪里做网站曲靖seo建站
  • wordpress做门户谷歌seo网络公司
  • 三水网站建设百度电话客服24小时人工服务热线
  • 建设糖果网站的好处有哪些品牌营销公司
  • 中国电子系统建设公司网站国家免费职业培训平台
  • 网站原型设计和版式设计百度产品推广
  • 东莞建站模板源码seo在线培训课程