首页 > 其他分享 >Leetcode面试经典150题-64.最小路径和

Leetcode面试经典150题-64.最小路径和

时间:2024-09-28 09:50:19浏览次数:8  
标签:150 int ++ length grid 左上角 64 Leetcode dp

给定一个包含非负整数的 m x n 网格 grid ,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。

说明:每次只能向下或者向右移动一步。

示例 1:

输入:grid = [[1,3,1],[1,5,1],[4,2,1]]
输出:7
解释:因为路径 1→3→1→1→1 的总和最小。

示例 2:

输入:grid = [[1,2,3],[4,5,6]]
输出:12

提示:

  • m == grid.length
  • n == grid[i].length
  • 1 <= m, n <= 200
  • 0 <= grid[i][j] <= 200

这个题我用了两个解法,提交的解复杂度更优,使用了数组压缩技巧,如果实在看不懂另外一个解也是保过的,数组压缩这玩意没人强求,量力而行其他的就不多说了,上代码,看不懂的请留言或者私信,收到第一时间解答

class Solution {
    /**典型的动态规划的问题,题意分析如下:(1)我们要从左上角走到右下角 
    (2)只能往右或者往下走,这意味这某个格子的上一步只能是它左边和它上面的格子
    (3)计算的路径里包含左上和右下两个格子,别忘了加上*/
    public int minPathSum2(int[][] grid) {
        /**如果就一个格子,那你就站在终点上,没得选,直接把值返回 */
        if(grid.length == 1 && grid[0].length == 1) {
            return grid[0][0];
        }
        /**否则定义动态规划数组,dp[i][j]代表从左上角到(i,j)位置的最小路径和 */
        int[][] dp = new int[grid.length][grid[0].length];
        /**左上角没得选择 */
        dp[0][0] = grid[0][0];
        /**初始化第一行和第一列,第一行除了(0,0)都只能由它右边来*/
        for(int j = 1; j < grid[0].length; j++) {
            dp[0][j] = dp[0][j-1] + grid[0][j];
        }
        /**第一列只能从它上面位置来 */
        for(int i = 1; i < grid.length; i++) {
            dp[i][0] = dp[i-1][0] + grid[i][0];
        }
        /**初始化一般的位置*/
        for(int i = 1; i < grid.length; i++) {
            for(int j = 1; j < grid[i].length; j++) {
                /**来到当前位置,上一步肯定是左边或者上面,谁小选谁 */
                dp[i][j] = Math.min(dp[i-1][j], dp[i][j-1]) + grid[i][j];
            }
        }
        return dp[grid.length -1][grid[0].length - 1];
    }

    /**进阶版的动态规划,数组压缩技巧,思路就是我们当前的每一行肯定只依赖上一行,所以没有必要用一个二维数组
    这是对空间的一个很大的浪费*/
    public int minPathSum(int[][] grid) {
        /**如果就一个格子,那你就站在终点上,没得选,直接把值返回 */
        if(grid.length == 1 && grid[0].length == 1) {
            return grid[0][0];
        }
        /**定义动态规划数组,计算到某一行i的时候dp[j]代表从左上角到(i,j)位置的最小路径和*/
        int[] dp = new int[grid[0].length];
        /**当前我们计算第一行,0位置是左上角,它没得选*/
        dp[0] = grid[0][0];
        /**初始化第一行*/
        for(int j = 1; j < grid[0].length; j++) {
            dp[j] = dp[j-1] + grid[0][j];
        }
        /**初始化一般的位置*/
        for(int i = 1; i < grid.length; i++) {
            for(int j = 0; j < grid[i].length; j++) {
                /**来到当前位置,上一步肯定是左边或者上面,谁小选谁,左边就是dp[j-1],上面就是dp[j](上一行计算的,这一样目前没有更新,一会更新)*/
                dp[j] = j == 0? dp[j] + grid[i][j] : Math.min(dp[j-1],dp[j]) + grid[i][j];
            }
        }
        return dp[grid[0].length - 1];
    }
}

标签:150,int,++,length,grid,左上角,64,Leetcode,dp
From: https://blog.csdn.net/Chang_Yafei/article/details/142579720

相关文章

  • LeetCode--Dota2 参议院(day 2)
     今天给大家带来LeetCode中的一道算法题:参议院问题,忘记具体内容的朋友可以观看下图: 根据题意,我们可以清楚的认识到获胜条件:那就是字符串中仅包含D或R。 我们先以RDRDD为例进行说明: 字符串中的第一个R行使权力,淘汰D阵营中的某一位,我们可以看见字符串中有三个D,那么该......
  • leetCode--爬楼梯(记录做题过程加深印象)
    首先最广泛的方法为递归,直接上代码:intclimbStairs(intn){if(n==1){return1;}if(n==2){return2;}if(flag[n])returnflag[n];returnflag[n]=climbStairs(n-1)+climbStair......
  • 剪枝的应用,bfs判重 蚱蜢跳——蓝桥p642
    **问题描述总共有九个盘子,八只蚱蜢,且每个盘子中只能容下一只蚱蜢,蚱蜢的编号为1~8,如果蚱蜢所在的盘子紧邻着空盘子,那么该蚱蜢可以从自己的盘子跳到空盘子中,也可以隔一个盘子跳到空盘子中,问一开始状态是012345678,蚱蜢至少该跳多少步才可以被变为087654321**输入无**输出蚱蜢跳......
  • 【算法题】72. 编辑距离-力扣(LeetCode)
    【算法题】72.编辑距离-力扣(LeetCode)1.题目下方是力扣官方题目的地址72.编辑距离给你两个单词word1和word2,请返回将word1转换成word2所使用的最少操作数。你可以对一个单词进行如下三种操作:插入一个字符删除一个字符替换一个字符示例1:输入:word1="ho......
  • NSSCTF [HUBUCTF 2022 新生赛]simple_RE(变种base64编码)
    文件无壳拖入IDA中shift+F12查看可疑字符串发现两串字符串一看这两个等于号就猜测是base64编码进入主函数看看这段代码是一个简单的C语言程序,主要功能是接受用户输入的字符串作为“flag”,然后通过对输入的字符串进行一些处理和比较来验证是否输入了正确的“flag”。......
  • 875. 爱吃香蕉的珂珂(leetcode)
    https://leetcode.cn/problems/koko-eating-bananas/description/二段性:速度有得完和不吃完两个段关键点是编写check函数,比较繁杂classSolution{publicintminEatingSpeed(int[]piles,inth){intsum=0;intmax=0;for(inti=0;i<piles.......
  • letcode 643
    给你一个由 n 个元素组成的整数数组 nums 和一个整数 k 。请你找出平均数最大且 长度为 k 的连续子数组,并输出该最大平均数。任何误差小于 10-5 的答案都将被视为正确答案。示例1:输入:nums=[1,12,-5,-6,50,3],k=4输出:12.75解释:最大平均数(12-5-6+50)/......
  • Leetcode 154. 寻找旋转排序数组中的最小值 II
    1.题目基本信息1.1.题目描述已知一个长度为n的数组,预先按照升序排列,经由1到n次旋转后,得到输入数组。例如,原数组nums=[0,1,4,4,5,6,7]在变化后可能得到:若旋转4次,则可以得到[4,5,6,7,0,1,4]若旋转7次,则可以得到[0,1,4,4,5,6,7]注意,数组[a[0],a[1],a[2],......
  • 具有 1Gbps 以太网 TMS320C6454BCTZ7/TMS320C6454BCTZ8/TMS320C6454BGTZA C64x+ 定点
    TMS320C6454器件是TMS320C6000™DSP平台中性能最高的定点DSP产品。C6454器件基于德州仪器(TI)开发的第三代高性能高级VelociTI超长指令字(VLIW)架构,是视频和电信基础设施、成像/医疗和无线基础设施(WI)等应用的绝佳选择。C6454设备为不需要C6455的2MB或串行RapidIO提供的高速互连......
  • 面试经典 150 题:力扣88. 合并两个有序数组
    每周一道算法题启动题目【题目链接】【解法一】合并后排序排序后的数组自动省略0的数字,又学到了classSolution{public:voidmerge(vector<int>&nums1,intm,vector<int>&nums2,intn){//合并两个数组后排序for(inti=0;i<n;i++)......