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

力扣 T62 不同路径

题目

连接

思路

思路1 : BFS爆搜

class Solution {
public:queue<pair<int,int>>q;int uniquePaths(int m, int n) {q.push({1,1});  // 起始位置vector<pair<int, int>> actions;actions.push_back({0, 1});  // 向下actions.push_back({1, 0});   // 向右int ans = 0;while(!q.empty()){auto s = q.front();q.pop();for(auto action : actions){int x = s.first, y = s.second;if(x == n && y == m) {ans ++; break;}x += action.first, y += action.second;if(x <= n && y <= m) q.push({x, y});}}return ans;}
};

超时了。
在这里插入图片描述

思路2: dp

我们将起始点编号为 { 1 , 1 } \{1,1\} {1,1}
设finish点为: { 2 , 3 } \{2, 3\} {2,3}
d p [ i ] [ j ] dp[i][j] dp[i][j] :到达点 i i i j j j 的最多路径。
转移式子如下:
d p [ i ] [ j ] = d p [ i − 1 ] [ j ] + d p [ i ] [ j − 1 ] dp[i][j] = dp[i - 1][j] + dp[i][j - 1] dp[i][j]=dp[i1][j]+dp[i][j1]
d p [ 1 ] [ j ] dp[1][j] dp[1][j] d p [ i ] [ 1 ] dp[i][1] dp[i][1] 均为1.

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

复杂度优化

我们可以优化空间复杂度。原本空间复杂度是 O ( m n ) O(mn) O(mn)的。
我们观察, d p [ i ] [ j ] dp[i][j] dp[i][j]是由 d p [ i − 1 ] [ j ] dp[i-1][j] dp[i1][j] d p [ i ] [ j − 1 ] dp[i][j-1] dp[i][j1] 转移过来的。
我们画图:
在这里插入图片描述

红色是目前准备更新的值,其只与绿色和蓝色的值有关。
我们尝试利用 背包思想 把他们进行压缩:
我们把他们压缩成一维,数组中每个值的含义与我们枚举 j j j 的顺序有关:
在这里插入图片描述

我们观察上图,可以发现,需要从左向右枚举 j j j

代码

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

注意
dp数组压缩成1维后, d p [ j ] dp[j] dp[j] 的含义仍然是走到 j j j 列,共多少种走法。
因此 d p dp dp数组初始化为1,因为 d p [ 1 ] = 1 dp[1] = 1 dp[1]=1,走到第 1 1 1 列 就一种走法。
最终输出 d p [ n ] dp[n] dp[n]
在这里插入图片描述

相关文章:

  • leetcode389:找不同
  • XUbuntu24.04之制作ISO镜像启动盘(二百四十八)
  • module ‘django_cas_ng.views‘ has no attribute ‘login‘
  • 备战 清华大学 上机编程考试-冲刺前50%,倒数第5天
  • VM渗透系统合集(下载链接)
  • Objective-C的初始化方法中,应该如何读写属性
  • svnadmin备份和还原
  • 大模型训练的艺术:从预训练到增强学习的四阶段之旅
  • 数字IC必备知识点:【0】文章汇总
  • 爱德华三坐标软件ACdmis.AC-dmis密码注册机
  • 大模型开发Semantic Kernel 简介
  • java版多语言抢单系统 多语言海外AEON抢单可连单加额外单源码 抢单平台搭建开发 抢单开挂的软件
  • Linux shell编程学习笔记58:cat /proc/mem 获取系统内存信息
  • MySQL-数据处理(1)
  • Linux Kernel入门到精通系列讲解(RV-Kernel 篇) 5.3 从零移植 busybox,基于RISC-V
  • [iOS]Core Data浅析一 -- 启用Core Data
  • [rust! #004] [译] Rust 的内置 Traits, 使用场景, 方式, 和原因
  • Git同步原始仓库到Fork仓库中
  • Hibernate最全面试题
  • iOS筛选菜单、分段选择器、导航栏、悬浮窗、转场动画、启动视频等源码
  • Java 内存分配及垃圾回收机制初探
  • Java应用性能调优
  • Linux各目录及每个目录的详细介绍
  • python大佬养成计划----difflib模块
  • python学习笔记 - ThreadLocal
  • Spring声明式事务管理之一:五大属性分析
  • SpriteKit 技巧之添加背景图片
  • webpack+react项目初体验——记录我的webpack环境配置
  • 回顾2016
  • 微信支付JSAPI,实测!终极方案
  • 问:在指定的JSON数据中(最外层是数组)根据指定条件拿到匹配到的结果
  • 用Python写一份独特的元宵节祝福
  • 原生Ajax
  • AI又要和人类“对打”,Deepmind宣布《星战Ⅱ》即将开始 ...
  • # Swust 12th acm 邀请赛# [ A ] A+B problem [题解]
  • ###51单片机学习(2)-----如何通过C语言运用延时函数设计LED流水灯
  • #1014 : Trie树
  • #ifdef 的技巧用法
  • #Java第九次作业--输入输出流和文件操作
  • #pragma multi_compile #pragma shader_feature
  • #基础#使用Jupyter进行Notebook的转换 .ipynb文件导出为.md文件
  • (+4)2.2UML建模图
  • (2009.11版)《网络管理员考试 考前冲刺预测卷及考点解析》复习重点
  • (22)C#传智:复习,多态虚方法抽象类接口,静态类,String与StringBuilder,集合泛型List与Dictionary,文件类,结构与类的区别
  • (a /b)*c的值
  • (windows2012共享文件夹和防火墙设置
  • (附源码)基于ssm的模具配件账单管理系统 毕业设计 081848
  • (九)信息融合方式简介
  • (十)【Jmeter】线程(Threads(Users))之jp@gc - Stepping Thread Group (deprecated)
  • (算法)硬币问题
  • (淘宝无限适配)手机端rem布局详解(转载非原创)
  • (一)python发送HTTP 请求的两种方式(get和post )
  • (一)认识微服务
  • (转) RFS+AutoItLibrary测试web对话框
  • (转)http协议