LeetCode 62. Unique Paths

2023-11-08

题目链接

题目描述

A robot is located at the top-left corner of a m x n grid (marked ‘Start’ in the diagram below).

The robot can only move either down or right at any point in time. The robot is trying to reach the bottom-right corner of the grid (marked ‘Finish’ in the diagram below).

How many possible unique paths are there?
图案说明

Above is a 7 x 3 grid. How many possible unique paths are there?

Note: m and n will be at most 100.

Example 1:

Input: m = 3, n = 2
Output: 3
Explanation:
From the top-left corner, there are a total of 3 ways to reach the bottom-right corner:
1. Right -> Right -> Down
2. Right -> Down -> Right
3. Down -> Right -> Right
Example 2:

Input: m = 7, n = 3
Output: 28

思路

类似于爬梯子的问题。

递归

可以使用递归方法,其中会超时,大量重复计算的,递归的截止条件是只有一行,或者一列,只有一种,此时只有一种路径, return 1,

f(m,n) = f(m-1,n)+f(m,n-1) if(m>0 && n>0)
            = 1,  if(m==1 || n==1)
f(m,n) = f(m-1,n)+f(m,n-1) if(m>0 && n>0)            = 1,  if(m==1 || n==1)

视频讲解

递归代码

Java
public int solution_1(int m, int n){
        return unqiue_path_1(n,m);
        //n 代表row, m代表 columns
        }
    //递归方法,总的方法等于右下两种方法叠加起来的总体情况,超时
    private int unqiue_path_1(int row,int column){
       //当只有一行或者一列的时候只有一种情况,一条路径,
        if(row==1 || column==1) return 1;
       //m代表向右走的情况(总的路径数), n代表向做,
        return unqiue_path_1(row,column-1)+unqiue_path_1(row-1,column) ; //在这里不用加上2
    }

改进一:记录型递归

增加一个二维数组dp[row][column]

dp[i][j]=f(i+1,j,row,column,dp)+f(i,j+1,row,column,dp)0<=i<row,0<=j<column; d p [ i ] [ j ] = f ( i + 1 , j , r o w , c o l u m n , d p ) + f ( i , j + 1 , r o w , c o l u m n , d p ) 0 <= i < r o w , 0 <= j < c o l u m n ;

如果dp[i][j]>0, 证明已经是算过的,避免重复计算,直接返回即可

代码

public int solution_2(int m,int n){
       int [][] dp = new int[n][m];
       return unqiue_path_2(0,0,n,m,dp);
    }
    private int unqiue_path_2(int i,int j, int row, int column,int [][]dp){
        if(i==row-1 || start_j==column-1) return 1;
        if(i>=row || j>=column) return 0;
        if(dp[i][j]>0) return dp[i][j];
        dp[i][j] = unqiue_path_2(i+1,j,row,column,dp)+unqiue_path_2(i,j+1,row,column,dp);
        return dp[i][j];
    }

原始动态

dp[i][j]表示从起点位置走到(i,j)处的大小,
dp[i][j] = dp[i-1][j]+dp[i][j];
在dp[0][j]=1,dp[i][0]=1,只有一种路径,可以走,也是初始化的条件

//倒过来求解的
 public int solution_3(int m, int n){
       int [][] dp=new int [n][m];
        //只能往右走只有一种路径
        for(int i=0;i<m;++i){
            dp[0][i] =1;
        }
        //只能向下走只有一条路径
        for(int j=0;j<n;j++){
            dp[j][0]=1;
        }
        for(int i=1;i<n;i++){
            for(int j=1;j<m;j++){
                dp[i][j] =dp[i-1][j]+dp[i][j-1];
            }
        }
        return dp[n-1][m-1];

性能

时间复杂度为0(n^2), 空间复杂度为0(n*m)

改进版动态规划

思路

dp[i][j] = dp[i][j-1]+dp[i-1][j],可以采用逐步叠加的方法,先处理每一行的情况,从左到右,从上到下,可以用滚动数组实现
从第一行开始,也可以从第一列开始

代码

public int solution_3_1(int m, int n){
  if(m<1||n<1) return 0;
        int [] dp = new int[m];
       //第一行路径只能为1,

        Arrays.fill(dp,1);
        //从第二行开始,因为第一行智能有一种路径
        for(int i=1;i<n;++i){
       //从第二列开始,因为第一列只能有只用路径
            for(int j=1;j<m;++j){
    //每一行处理dp[j],相单于dp[i-1][j], dp[j-1]相单于dp[i][j-1]
                dp[j] = dp[j-1]+dp[j];
           }
        }
        return dp[m-1];
         }

复杂度分析

时间复杂度为0(n*m), 空间复杂度为0(min(m,n)
讲解视频(VPN)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

LeetCode 62. Unique Paths 的相关文章

  • C语言/C++实现栈操作

    一 栈的概念 栈是一种常用的数据结构 它遵循先入后出 Last In First Out LIFO 的原则 栈的操作只在栈的一端进行 该端被称为栈顶 而另一端称为栈底 栈的基本操作包括压栈 入栈 push 和弹栈 出栈 pop 分别用于将元
  • 数据结构----链式栈

    目录 前言 链式栈 操作方式 1 存储结构 2 初始化 3 创建节点 4 判断是否满栈 5 判断是否空栈 6 入栈 7 出栈 8 获取栈顶元素 9 遍历栈 10 清空栈 完整代码 前言 前面我们学习过了数组栈的相关方法 链接 线性表 栈 栈
  • 常用的十种算法--马踏棋盘算法

    1 马踏棋盘算法介绍 马踏棋盘算法也被称为骑士周游问题 将马随机放在国际象棋的 8 8 棋盘 Board 0 7 0 7 的某个方格中 马按走棋规则 马走日字 进行移动 要求每个方格只进入一次 走遍棋盘上全部 64 个方格 2 马踏棋盘算法
  • SDUT--OJ《数据结构与算法》实践能力专题训练6 图论

    A 数据结构实验之图论一 基于邻接矩阵的广度优先搜索遍历 Description 给定一个无向连通图 顶点编号从0到n 1 用广度优先搜索 BFS 遍历 输出从某个顶点出发的遍历序列 同一个结点的同层邻接点 节点编号小的优先遍历 Input
  • 手把手教你实现一个向量

    文章目录 什么是向量 向量提供哪些接口 实现 宏定义 定义类 成员变量 构造函数与析构函数 构造函数 析构函数 成员函数 size get r put r e expand insert r e remove lo hi remove r
  • 数据结构小白之插入排序算法

    1 插入排序 1 1 思路 将n个需要排序的元素看成两个部分 一个是有序部分 一个是无序部分 开始的时候有序表只有一个元素 无序表有n 1个元素 排序过程中每次从无序表中取出元素 然后插入到有序表的适当位置 从而成为新的有序表 类似排队 如
  • Python 实现列队

    1 列队定义 队列是项的有序结合 其中添加新项的一端称为队尾 移除项的一端称为队首 当一个元素从队尾进入队列时 一直向队首移动 直到它成为下一个需要移除的元素为止 最近添加的元素必须在队尾等待 集合中存活时间最长的元素在队首 这种排序成为
  • 数据结构与算法书籍推荐

    学习数据结构与算法 还是很有必要看几本相关的书籍 但根据不同基础的人 合适看的书也不一样 因此 针对不同层次 不同语言的人 推荐几本市面上口碑不错的书 1 入门级 针对刚入门的同学 建议不要急着去看那些经典书 像 算法导论 算法 这些比较经
  • 链表面试题(一):反转链表的算法实现

    关于链表的考察 链表是面试里面经常涉及到的考点 因为链表的结构相比于Hashmap Hashtable Concurrenthashmap或者图等数据结构简单许多 对于后者更多面试的侧重点在于其底层实现 比如Hashmap中Entry
  • JavaScript系列——数组元素左右移动N位算法实现

    引言 在自己刚刚毕业不久的时候 去了一家公司面试 面试官现场考了我这道题 我记忆深刻 当时没有想到思路 毫无疑问被面试官当成菜鸟了 最近刚好在研究数组的各种算法实现 就想到这道题 可以拿来实现一下 纪念自己逝去的青春 需求 假设有这样一个数
  • 4Sum

    Given an array S of n integers are there elements a b c and d in S such that a b c d target Find all unique quadruplets
  • OJ-合并两个有序链表

    题目描述 代码如下 Definition for singly linked list struct ListNode int val struct ListNode next struct ListNode mergeTwoLists s
  • 数理统计知识整理——回归分析与方差分析

    题记 时值我的北科研究生第一年下 选学 统计优化 课程 备考促学 成此笔记 以谨记 1 线性回归 1 1 原理分析 要研究最大积雪深度x与灌溉面积y之间的关系 测试得到近10年的数据如下表 使用线性回归的方法可以估计x与y之间的线性关系 线
  • 二叉树结构的建立与遍历

    实验项目 1 编写建立二叉树的二叉链表存储结构 左右链表示 的程序 并以适当的形式显示和保存二叉树 2 完成二叉树的7种遍历操作 3 给定一个二叉树 编写算法完成下列应用 1 判断其是否为完全二叉树 2 求二叉树中任意两个结点的公共祖先 输
  • 基数排序代码实现

    详情请看排序总结 传送门 https blog csdn net m0 52711790 article details 121914543 基数排序的知识点我就不贴出来 相信都能搜到对应概念解释 下面就直接上代码 代码解释其实也很清晰了
  • 雪糕的最大数量 排序+贪心

    雪糕的最大数量 雪糕的最大数量 题目描述 样例 数据范围 思路 代码 题目描述 夏日炎炎 小男孩 Tony 想买一些雪糕消消暑 商店中新到 n 支雪糕 用长度为 n 的数组 costs 表示雪糕的定价 其中 costs i 表示第 i 支雪
  • 【数据结构】双链表的定义和操作

    目录 1 双链表的定义 2 双链表的创建和初始化 3 双链表的插入节点操作 4 双链表的删除节点操作 5 双链表的查找节点操作 6 双链表的更新节点操作 7 完整代码 嗨 我是 Filotimo 很高兴与大家相识 希望我的博客能对你有所帮助
  • 浅谈归并排序:合并 K 个升序链表的归并解法

    在面试中遇到了这道题 如何实现多个升序链表的合并 这是 LeetCode 上的一道原题 题目具体如下 用归并实现合并 K 个升序链表 LeetCode 23 合并K个升序链表 给你一个链表数组 每个链表都已经按升序排列 请你将所有链表合并到
  • 高精度运算合集,加减乘除,快速幂,详细代码,OJ链接

    文章目录 零 前言 一 加法 高精度加法步骤 P1601 A B 二 减法 高精度减法步骤
  • 最大流-Dinic算法,原理详解,四大优化,详细代码

    文章目录 零 前言 一 概念回顾 可略过 1 1流网络 1 2流 1 3最大流 1 4残留网络 1 5增广路

随机推荐

  • vue将后端获取到的路由,通过 addRouter 动态添加。

    获取路由参数 将路由添加到路由集合中去 获取 路由信息 axios post api mock getMenu then resp gt let datas resp data 遍历获取到的路由数组将其添加到全局路由中 datas forE
  • vue之watch的用法

    一 什么是watch watch 用于监听data里面的数据是否被修改 一旦修改就可以执行一些其他的操作 也是方法 二 watch的用法 watch在监听的时候 可以有二次参数 第一次参数为更新的数据 第二个参数为之前的旧数据 div h1
  • 广电家庭服务器维修电话,广电家庭服务器换路由器怎么设置

    广电家庭服务器换路由器怎么设置 内容精选 换一换 用户的弹性云服务器已绑定EIP 但是无法连接到Internet 弹性云服务器通过EIP访问Internet的流程如图1所示 本问题请按照以下思路进行排查处理 查看弹性云服务器运行是否正常查看
  • HBase 二级索引的设计 (案例讲解)

    HBase 二级索引的设计 案例讲解 最近做的一个项目涉及到了多条件的组合查询 数据存储用的是HBase 恰恰HBase对于这种场景的查询特别不给力 一般HBase的查询都是通过RowKey 要把多条件组合查询的字段都拼接在RowKey中显
  • SQL Server 2016新特性:DROP IF EXISTS

    在我们写T SQL要删除某个对象 表 存储过程等 时 一般会习惯先用IF语句判断该对象是否存在 然后DROP 比如 旧版本 IF OBJECT ID dbo PERSON U IS NOT NULL DROP TABLE PERSON IF
  • element-plus中el-sub-menu样式修改

    注意
  • 二分查找(代码实例)

    基本思路 当我们要从一个序列中查找一个元素的时候 最快想到的方法就是顺序查找法 即 从前到后依次查找 但这种方法过于无脑 就是暴力的把每个元素都排查一遍 元素个数少的时候还行 一旦元素个数多起来 效率是非常低下 所以在实际中这种查找的方法是
  • 前程无忧招聘信息爬取

    爬取前程无忧招聘信息 本文是关于招聘数据爬取 我们选取的网站是前程无忧 百度直接搜索前程无忧 或者51job 我们将看到搜索栏 在搜索栏中输入 数据分析师 将可以看到工作信息 至于分析网站在这里就不在解释了 本爬虫只是简单爬取一点数据 所以
  • 计算机怎么盲打键盘,如何练习盲打 键盘盲打指法练习技巧-电脑教程

    很多人在电脑上打字都还需要看着键盘 不会盲打 看到电脑高手噼里啪啦的打字速度着实令人羡慕 很多小白朋友所自己笨 不会盲打 其实不会盲打并不是因为笨 而是没找到一种简单易行的练习方法 按照标准指法 看着键盘按照从A到Z的顺序打26个字母 最多
  • Mysql多对多关系,分组拼接把多个数据查询到一条数据上

    GROUP CONCAT str 分组字符串拼接 与分组一起使用 案例 查询企业信息以及企业分类信息 其中企业分类信息和企业是多对多的关系 按普通的联表查询 我们会查询到一条企业信息对应多个企业分类 会出现多个记录 如果想实现把同一个企业的
  • 全面理解java中的构造方法以及this关键字的用法(超详细)

    Hello 各位铁汁们 我是小 儿哈 今天我又来更新我的Java基础学习博客了 本篇主要内容概述 1 如何用构造方法初始化对象 2 为啥要有this这个关键字 3 this 属性名访问成员变量 成员方法 4 this 方法名 this 的用
  • Pandas进阶筛选和取数操作

    总结了pandas各种进阶操作与使用技巧 并且对各方法间的效率进行比较 创建一个pandas的dataframe对象作为下文样例 import pandas as pd import numpy as np df pd DataFrame
  • 陀螺研究院:《2019年分布式金融商业趋势及落地情况分析报告》

    2018年末开始 以DeFi为代表的分布式金融 在业内引起了广泛的讨论 传统的金融模式以中央银行 商业银行 非银金融机构为核心展开支付 借贷 保险等场景内的应用 但DeFi彻底摆脱了原有的核心 以分布式账本作为清算依据 从而降低了金融服务中
  • 前馈全连接神经网络和函数逼近、时间序列预测、手写数字识别

    https www cnblogs com conmajia p annt feed forward fully connected neural networks html 前馈全连接神经网络和函数逼近 时间序列预测 手写数字识别 And
  • springboot中JDBC连接超时问题

    最近项目中有一个问题 电子保卡信息要写入数据库 但写入失败 报错 息是这样的 The last packet successfully received from the server was 57 704 088 milliseconds
  • Stream流

    Stream流 Stream 流 是一个来自数据源的元素队列并支持聚合操作 元素是特定类型的对象 形成一个队列 Java中的Stream并不会存储元素 而 是按需计算 数据源 流的来源 可以是集合 数组等 聚合操作 类似SQL语句一样的操作
  • Bes 充电盒协议总结

    1 开盖 上升沿信号开机 a 充电脚设成3 0 v 然后延迟160ms b 充电脚设成5v 然后延时100 ms c充电脚设成3 0 v 2 合盖 a 开5v 然后延时3s b 关5v 然后延时45ms c 发送复位pattern 0101
  • c++ 字符串相等比较

    介绍 在C 中比较字符串的技术 Techniques to Compare Strings in C Strings in C can be compared using either of the following techniques
  • mysql命令 show_mysql--SHOW命令大全

    SHOW AUTHORS 顾名思义 这个要展示的是各位MYSQL开发者的信息 包括姓名 住址及相关注解 e g 1 mysql gt show authors G 1 row Name Brian Krow Aker Location Se
  • LeetCode 62. Unique Paths

    题目链接 题目描述 A robot is located at the top left corner of a m x n grid marked Start in the diagram below The robot can only