Qt地铁智慧换乘系统浅学( 三 )最少路径和最少换乘实现

news2025/1/11 22:35:38

本算法全都基于广度优先

  • 概念
  • 最短路径实现
    • 所用容器
    • 算法思路
  • 最少换乘实现
    • 所需容器
    • 算法思路
  • 成果展示
  • 代码实现
    • 判断是最短路径还是最少换乘
    • 最短路径代码实现
    • 最少换乘代码实现
    • 根据所得List画出线路
  • ui界面的维护(前提条件)
    • 界面
    • 初始化combox控件
    • 建立槽函数

概念

概念这里不过多介绍,很多文章介绍
大体意思是队列思想,每次入队相邻的节点,按照队列以此调用
这里如果想要实现最短路,最少换乘的话,需要用到优先队列
在以上的基础上,对队列进行dist距离的排序,或者trans换乘次数的排序
每次去除最少的,也类似于贪心

最短路径实现

所用容器

typedef std::pair<int,int> PII;  //dist trans
typedef std::pair<QString,QString> nodea; //stationname linename
typedef std::pair<PII,nodea> PLL;  //dist trans ..... ....
QMap<QString,int> dist; //距离表
QMap<QString,int> trans; //换乘
QMap<nodea,bool> final; //是否遍历过
QMap<QString,nodea>pre;  //父节点维护
std::priority_queue<PLL,std::vector<PLL >, std::greater<PLL > > q;  ///优先队列 每次取dist最少的节点

算法思路

这里我们实现了最短路径下最少换乘


1 将换乘表 和 距离表全部设置为INTMAX

2 将起点的 换成表 和 距离表 设置为 0
3 将出发站信息存储到优先队列q中 { {00}{startstr , linename} } 注意(出发点可能有多个,出发点有可能属于多个线路)
4 将pre[startstr]赋值为{ "00","00"} 方便还原路径时截止
5 进入while循环 每次取top值 ,为换乘最少的站 ,判断final[top.second]是否为true,如果已经遍历过 那么continue ,否则 final[top.second] = true
6 遍历这个站临近的站点 l , 然后遍历站点i 与 l 所属的线路 k  我们设nodea j ={ l,k}   这时候我们讨论  设now = top.second
(1) 如果dist[j.first] > dist[now .first] + dp[now.first][j.first]  则更新 ,   pre[j.first] = now;
	   如果大于则 更新 ,并且 pre[j.frist] =  now ; 距离表同样也更新 然后入队列

 (2) 如果dist[j.first] == dist[now .first] + dp[now.first][j.first]
        我们需要判断换乘最少!
        如果k==now.second 说明不需要换乘 我们判断trans[j.first] 是否大于 trans[now.first]即可  如果大于则更新
        如果k!=now.second 说明需要换乘 我们判断trans[j.first] 是否大于 trans[now.first]+1 即可 如果大于则更新
        
7 最后等待while执行完毕 我们获得了 pre[ endstr ]的信息,然后循环调用pre 直到00结束

最少换乘实现

所需容器

QMap<QString,int> dist; //距离表

QMap<QString,int> trans; //换乘

QMap<nodea,bool> final; //是否遍历过

typedef std::pair<int,int> PII;  //换乘 距离

typedef std::pair<QString,QString> nodea; //站点名 和 线路名

typedef std::pair<PII,nodea> PLL; // 某个站点的换成次数 和 距离 以及父站点和所属线路

QMap<QString,nodea>pre;  //还原最少换乘的工具

std::priority_queue<PLL,std::vector<PLL >, std::greater<PLL > > q; //优先队列 优先使用换乘最少的站点

算法思路

算法思路

1 将换乘表 和 距离表全部设置为INTMAX

2 将起点的 换成表 和 距离表 设置为 0
3 将出发站信息存储到优先队列q中 { {00}{startstr , linename} } 注意(出发点可能有多个,出发点有可能属于多个线路)
4 将pre[startstr]赋值为{ "00","00"} 方便还原路径时截止
5 进入while循环 每次取top值 ,为换乘最少的站 ,判断final[top.second]是否为true,如果已经遍历过 那么continue ,否则 final[top.second] = true
6 遍历这个站临近的站点 l , 然后遍历站点i 与 l 所属的线路 k  我们设nodea j ={ l,k}      这时候我们讨论  设now = top.second
(1)如果站点i的线路 与 k 一样 那么换乘次数不会增加 这个时候我们判断 trans[j.first] 是否大于 trans[i] 
 如果大于则 更新 ,并且 pre[j.frist] =  now ; 距离表同样也更新 然后入队列
 如果 换乘次数相等的话  我们判断距离表 , 如果dist[j.first] > dist[now .first] + dp[now.first][j.first]则更新 pre[j.first] = now;
 (2) 如果站点i的线路 与 k不一样 那么我们的换乘就有可能+1
          这个时候我们判断trans[j.first]  是否大于 trans[now.frist] +1 如果大于 则更新 并且 pre[j.first] = { now.first,k} ; 距离表同样也更新 这里如果pre[j.frist] = now就会出错,问题在后续讲解
          如果 transp[j.irst]  == trans[now.first] +1  我们就判断距离表 如果dist[j.first] > dist[now .first] + dp[now.first][j.first] 则更新,pre[j.first] = {now.first,k} 
7 最后等待while执行完毕 我们获得了 pre[ endstr ]的信息,然后循环调用pre 直到00结束

成果展示

在这里插入图片描述

代码实现

判断是最短路径还是最少换乘

void ChooseShortorLessPath(QGraphicsView *graphicsView,QString startstr,QString endstr,QRadioButton *sht,QRadioButton *less,QTextBrowser *textBrowser){
    qDebug()<<"选择开始\n";
    if(startstr.size()==0||endstr.size()==0){
        QMessageBox MyBox(QMessageBox::Warning,"警告","请选择站点",QMessageBox::Yes|QMessageBox::No);
        MyBox.exec();
        return;
    }
    QMap<QString, node>::iterator it = Station.find(startstr);
    if (it == Station.end()) {
        QMessageBox MyBox(QMessageBox::Warning,"警告","输入站点有误",QMessageBox::Yes|QMessageBox::No);
        MyBox.exec();
        return;
    }
    it =Station.find(endstr);
    if (it == Station.end()) {
        QMessageBox MyBox(QMessageBox::Warning,"警告","输入站点有误",QMessageBox::Yes|QMessageBox::No);
        MyBox.exec();
        return;
    }
    if(startstr == endstr){
        QMessageBox MyBox(QMessageBox::Warning,"警告","请不要输入相同站点 ",QMessageBox::Yes|QMessageBox::No);
        MyBox.exec();
        return;
    }

    if(sht->isChecked()) getshortTimePath(graphicsView,startstr,endstr,textBrowser);
    if(less->isChecked()) getlessTransPath(graphicsView,startstr,endstr,textBrowser);

}

最短路径代码实现

typedef std::pair<int,int> PII;
typedef std::pair<QString,QString> nodea;
typedef std::pair<PII,nodea> PLL;

void getshortTimePath(QGraphicsView *graphicsView,const QString startstr,const QString endstr,QTextBrowser *textBrowser){
    qDebug()<<"选择成功\n";
    const int IntMax = INT32_MAX;
    QMap<QString,int> dist; //距离表
    QMap<QString,int> trans; //换乘
    QMap<nodea,bool> final; //是否遍历过


    for(auto i:Station.keys()){
        dist[i] = IntMax;
        trans[i] = IntMax;
    }


    QMap<QString,nodea>pre;
    pre[startstr] = nodea{"00","00"};
    std::priority_queue<PLL,std::vector<PLL >, std::greater<PLL > > q;
    for(auto i:Station_Line[startstr]){
        q.push(PLL{{0,0},nodea{startstr,i}});

    }
    dist[startstr] = 0;
    trans[startstr] = 0;
    qDebug()<<"初始化完成\n";

    while(q.size()){
        PLL f= q.top();
        q.pop();
        nodea now = f.second;
        if(final[now]) continue;
        final[now] = true;

        for(auto i:edge[now.first]){ //相邻的站点
            for(auto j:mp[now.first][i]){ //和相邻站点共有的线路

               qDebug()<<now.first<<"-----"<<i<<"----"<<j<<" \n ";
                nodea newnodea = nodea{i,j};
               if(final[newnodea]) continue;
                if(dist[i] > dist[i]+dp[now.first][i]){
                    dist[i] = dist[i]+dp[now.first][i];
                    qDebug()<<now.first<<"---"<<i<<"......."<<dist[i]<<" \n ";
                    if(j == now.second){ trans[i] = trans[now.first];  pre[i] = now; }
                    else {trans[i] = trans[now.first] + 1; pre[i] = nodea{now.first,j}; }

                    qDebug()<<i<<"---"<<pre[i]<<" \n ";
                    q.push(PLL{PII{dist[i],trans[i]},newnodea});

                }else if(dist[i] == dist[now.first]+dp[now.first][i]){
                    if(j == now.second){
                        if(trans[i] > trans[now.first]){
                              trans[i] = trans[now.first];
                              pre[i] = now;
                              q.push(PLL{PII{dist[i],trans[i]},newnodea});
                        }
                    }
                    if(j != now.second){
                        if(trans[i] > trans[now.first] + 1 ){
                              trans[i] = trans[now.first] + 1;
                              pre[i] = nodea{now.first,j};
                              q.push(PLL{PII{dist[i],trans[i]},newnodea});
                        }
                    }
                }
            }
        }
    }
    qDebug()<<"最短路执行完毕\n";
    QList<nodea>s;
    int t=0;
    nodea u = pre[endstr];
    while(u.second!="00"){
        s.append(u);
        qDebug()<<"---"<<u.first<<" \n ";
        u=pre[u.first];
        t++;
        if(t>40) return;
    }
    qDebug()<<"还原成功\n";
    drawpath(graphicsView,startstr,endstr,s,textBrowser);
}

最少换乘代码实现

void getlessTransPath(QGraphicsView *graphicsView ,const QString startstr,const QString endstr,QTextBrowser *textBrowser){
    qDebug()<<"选择成功\n";
    const int IntMax = INT32_MAX;
    QMap<QString,int> dist; //距离表
    QMap<QString,int> trans; //换乘
    QMap<nodea,bool> final; //是否遍历过


    for(auto i:Station.keys()){
        trans[i] = IntMax;
        dist[i] = IntMax;
    }


    QMap<QString,nodea>pre;
    pre[startstr] = nodea{"00","00"};
    std::priority_queue<PLL,std::vector<PLL >, std::greater<PLL > > q;
    for(auto i:Station_Line[startstr]){
        q.push(PLL{{0,0},nodea{startstr,i}});
    }
    dist[startstr] = 0;
    trans[startstr] = 0;
    qDebug()<<"初始化完成\n";

    while(q.size()){
        PLL f= q.top();
        q.pop();
        nodea now = f.second;
        if(final[now]) continue;
        final[now] = true;

        for(auto i:edge[now.first]){ //相邻的站点
            for(auto j:mp[now.first][i]){ //和相邻站点共有的线路

                qDebug()<<now.first<<"-----"<<i<<"----"<<j<<" \n ";
                nodea newnodea = nodea{i,j};
                if(final[newnodea]) continue;

                    if(j == now.second){
                        if(trans[i] > trans[now.first]){
                              dist[i] = dist[now.first] + dp[now.first][i];
                              trans[i] = trans[now.first];
                              pre[i] = now;
                              q.push(PLL{PII{trans[i],dist[i]},newnodea});
                              qDebug()<<now.first<<"---"<<i<<"......."<<dist[i]<<" \n ";
                        }else if(trans[i] == trans[now.first]){
                              if(dist[i] > dist[now.first]+dp[now.first][i]){
                              dist[i] = dist[now.first]+dp[now.first][i];
                              qDebug()<<now.first<<"---"<<i<<"......."<<dist[i]<<" \n ";
                              pre[i] = now;
                              q.push(PLL{PII{trans[i],dist[i]},newnodea});
                              }
                        }
                    }
                    if(j != now.second){
                        if(trans[i] > trans[now.first] + 1 ){
                              trans[i] = trans[now.first] + 1;
                              dist[i] = dist[now.first] + dp[now.first][i];
                              pre[i] = nodea{now.first,j};
                              q.push(PLL{PII{trans[i],dist[i]},newnodea});
                              qDebug()<<now.first<<"---"<<i<<"......."<<now<<" \n ";
                        }else if(trans[i] == trans[now.first] + 1 ){
                              if(dist[i] > dist[now.first]+dp[now.first][i]){
                              dist[i] = dist[now.first]+dp[now.first][i];
                              qDebug()<<now.first<<"---"<<i<<"......."<<dist[i]<<" \n ";
                              pre[i] = nodea{now.first,j};
                              q.push(PLL{PII{trans[i],dist[i]},newnodea});
                              }
                        }
                    }

            }
        }
    }
    qDebug()<<"最短路执行完毕\n";
    QList<nodea>s;
    int t=0;
    nodea u = pre[endstr];
    while(u.second!="00"){
        s.append(u);
        qDebug()<<"---"<<u.first<<" \n ";
        u=pre[u.first];
        t++;
        if(t>40) return;
    }
    qDebug()<<"还原成功\n";
    drawpath(graphicsView,startstr,endstr,s,textBrowser);
}

根据所得List画出线路

void getlessTransPath(QGraphicsView *graphicsView ,const QString startstr,const QString endstr,QTextBrowser *textBrowser){
    qDebug()<<"选择成功\n";
    const int IntMax = INT32_MAX;
    QMap<QString,int> dist; //距离表
    QMap<QString,int> trans; //换乘
    QMap<nodea,bool> final; //是否遍历过


    for(auto i:Station.keys()){
        trans[i] = IntMax;
        dist[i] = IntMax;
    }


    QMap<QString,nodea>pre;
    pre[startstr] = nodea{"00","00"};
    std::priority_queue<PLL,std::vector<PLL >, std::greater<PLL > > q;
    for(auto i:Station_Line[startstr]){
        q.push(PLL{{0,0},nodea{startstr,i}});
    }
    dist[startstr] = 0;
    trans[startstr] = 0;
    qDebug()<<"初始化完成\n";

    while(q.size()){
        PLL f= q.top();
        q.pop();
        nodea now = f.second;
        if(final[now]) continue;
        final[now] = true;

        for(auto i:edge[now.first]){ //相邻的站点
            for(auto j:mp[now.first][i]){ //和相邻站点共有的线路

                qDebug()<<now.first<<"-----"<<i<<"----"<<j<<" \n ";
                nodea newnodea = nodea{i,j};
                if(final[newnodea]) continue;

                    if(j == now.second){
                        if(trans[i] > trans[now.first]){
                              dist[i] = dist[now.first] + dp[now.first][i];
                              trans[i] = trans[now.first];
                              pre[i] = now;
                              q.push(PLL{PII{trans[i],dist[i]},newnodea});
                              qDebug()<<now.first<<"---"<<i<<"......."<<dist[i]<<" \n ";
                        }else if(trans[i] == trans[now.first]){
                              if(dist[i] > dist[now.first]+dp[now.first][i]){
                              dist[i] = dist[now.first]+dp[now.first][i];
                              qDebug()<<now.first<<"---"<<i<<"......."<<dist[i]<<" \n ";
                              pre[i] = now;
                              q.push(PLL{PII{trans[i],dist[i]},newnodea});
                              }
                        }
                    }
                    if(j != now.second){
                        if(trans[i] > trans[now.first] + 1 ){
                              trans[i] = trans[now.first] + 1;
                              dist[i] = dist[now.first] + dp[now.first][i];
                              pre[i] = nodea{now.first,j};
                              q.push(PLL{PII{trans[i],dist[i]},newnodea});
                              qDebug()<<now.first<<"---"<<i<<"......."<<now<<" \n ";
                        }else if(trans[i] == trans[now.first] + 1 ){
                              if(dist[i] > dist[now.first]+dp[now.first][i]){
                              dist[i] = dist[now.first]+dp[now.first][i];
                              qDebug()<<now.first<<"---"<<i<<"......."<<dist[i]<<" \n ";
                              pre[i] = nodea{now.first,j};
                              q.push(PLL{PII{trans[i],dist[i]},newnodea});
                              }
                        }
                    }

            }
        }
    }
    qDebug()<<"最短路执行完毕\n";
    QList<nodea>s;
    int t=0;
    nodea u = pre[endstr];
    while(u.second!="00"){
        s.append(u);
        qDebug()<<"---"<<u.first<<" \n ";
        u=pre[u.first];
        t++;
        if(t>40) return;
    }
    qDebug()<<"还原成功\n";
    drawpath(graphicsView,startstr,endstr,s,textBrowser);
}

ui界面的维护(前提条件)

界面

在这里插入图片描述

初始化combox控件

void initcombox(QComboBox *combox1,QComboBox *combox2){
    QStringList sta_name_list;
    for(auto &i:Station.keys())
        sta_name_list.append(i);
    std::sort(sta_name_list.begin(),sta_name_list.end(),[](const QString &s1, const QString &s2){
        return (s1.localeAwareCompare(s2) < 0);
    });
    combox1->addItems(sta_name_list);
    combox2->addItems(sta_name_list);
    QLineEdit *line1 = new QLineEdit;
    combox1->setLineEdit(line1);
    combox1->lineEdit()->clear();
    QLineEdit *line2 = new QLineEdit;
    combox2->setLineEdit(line2);
    combox2->lineEdit()->clear();
}

建立槽函数

connect(ui->pushButton,&QPushButton::clicked,this,[=]{
        ChooseShortorLessPath(ui->graphicsView,ui->comboBox->lineEdit()->text(),ui->comboBox_2->lineEdit()->text(),
                              ui->radioButton,ui->radioButton_2,ui->textBrowser);

    });

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1037364.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

把Eclipse整个文件夹添加到Microsoft Defender的排除项中

一.原因&#xff1a; Windows 10卫士显著降低了Eclipse的速度&#xff0c;原因是Windows 10卫士扫描JAR文件。这个问题已经报告给微软了。在此之前&#xff0c;解决此问题的一个方法是将Eclipse根目录添加到Windows 10 Defender的排除列表中&#xff0c;详细步骤在这里共享。 …

前端JavaScript入门到精通,javascript核心进阶ES6语法、API、js高级等基础知识和实战 —— JS基础(五)

接受自己原本的样子&#xff0c; 比努力扮演另一个轻松多了。 思维导图 对象 什么是对象 对象使用 遍历对象 索引号是字符串型&#xff0c;不推荐遍历数组。 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><me…

docker实现mysql主从复制(巨详细!!!)

docker实现mysql主从复制&#xff08;巨详细&#xff01;&#xff01;&#xff01;&#xff09; 新建主机服务容器实例3307进入/mydata/mysql-master/conf目录下新建my.cnf修改完配置后重启master实例进入mysql-master容器master容器实例内创建数据同步用户新建 服务器容器实例…

【论文阅读】内存数据库并发控制算法的实验研究

内存数据库并发控制算法的实验研究 原文链接jos.org.cn/jos/article/pdf/6454 摘要 并发控制算法的基本思想归纳为"先定序后检验”&#xff0c;基于该思想对现有各类并发控制算法进行 了重新描述和分类总结&#xff0c;于在开源内存型分布式事务测试床 3TS 上的实际对比实…

Tune-A-Video论文阅读

论文链接&#xff1a;Tune-A-Video: One-Shot Tuning of Image Diffusion Models for Text-to-Video Generation 文章目录 摘要引言相关工作文生图扩散模型文本到视频生成模型文本驱动的视频编辑从单个视频生成 方法前提DDPMsLDMs 网络膨胀微调和推理模型微调基于DDIM inversio…

动手学深度学习(pytorch版)第二章-2.3线性代数Note-linear-algebra

类型 标量&#xff1a;仅包含一个数值被称为标量 向量&#xff1a;向量可以被视为标量值组成的列表 矩阵&#xff1a;正如向量将标量从零阶推广到一阶&#xff0c;矩阵将向量从一阶推广到二阶。 A torch.arange(20).reshape(5, 4) A.T //转置 张量&#xff1a;是描述具有…

[36c3 2019]includer

[36c3 2019]includer 题目描述&#xff1a;Just sitting here and waiting for PHP 8.0 (lolphp). 首先来了解一下临时文件包含之PHP - compress.zlib:// 在 php-src 里可以找到和 compress.zlib:// 有关的代码 | code 注意到 STREAM_WILL_CAST&#xff0c;涉及到 cast 经常…

企业微信-通用开发参数回调设置

公司业务需要开发企业微信&#xff0c;注册三方服务商审核通过后&#xff0c; 开始配置开发信息。本篇中记录在调试url验证中遇到错误及解决方式。 目录 准备工作 下载php加解密库 下载文件说明 设置白名单 设置路径 参数说明 设置ip 回调处理 回调类型&#xff1a; …

【C++】布隆过滤器简单操纵模拟以及常见题目

&#x1f30f;博客主页&#xff1a; 主页 &#x1f516;系列专栏&#xff1a; C ❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ &#x1f60d;期待与大家一起进步&#xff01; 文章目录 前言一、求下标仿函数的建议二、布隆过滤器代码面试题1.近似算法&#xff1a;2.精确算…

Leetcode 409. 最长回文串

文章目录 题目代码&#xff08;9.24 首刷自解&#xff09; 题目 Leetcode 409. 最长回文串 代码&#xff08;9.24 首刷自解&#xff09; class Solution { public:int longestPalindrome(string s) {unordered_map<char, int> mp;for(char c : s) mp[c];int res 0;int…

【算法思想-排序】排序数组-力扣 912 题

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kuan 的首页,持续学…

nexus 私服 拉不了 jar 包,报 Not authorized

如果你排查了所有情况,并且确定账号密码都没问题,路径也正确,并且setting.xml都配置正确了 可以看下是不是这个原因

5、SpringBoot_热部署

六、热部署 1.热部署概述 概述&#xff1a;程序更改后&#xff0c;不需要重新启动服务器也能够实现动态更新 springboot 项目如何实现热部署&#xff1f; tomcat 已经内置到项目容器中了希望tomcat监听外部程序变化通过新建一个程序来监控你代码的变化 2.依赖导入 依赖 <…

2023蓝帽杯半决赛misc题目复现

后续会逐渐完善&#xff1a; misc--排排坐吃果果 我真是无大语了&#xff0c;对于我的死脑筋&#xff0c;文件一打开是一片白色&#xff0c;但是点开单元格会看到里面有数字&#xff0c;我想到了修改单元格的格式&#xff0c;就是没想到转换字体的颜色&#xff0c;对此我表示…

构建基于neo4j知识图谱、elasticsearch全文检索的数字知识库

前言&#xff1a; 在数字化时代&#xff0c;知识库的建设正逐渐成为企业、学术机构和个人的重要资产。本文将介绍如何使用neo4j和elasticsearch这两种强大的数据库技术来构建知识库&#xff0c;并对其进行比较和探讨。 技术栈&#xff1a; springbootvueneo4jelasticsearch…

map的一些测试-string键的查找

主要区别在于声明map的时候多了一个less<> #define _CRT_SECURE_NO_WARNINGS #include <iostream> #include <string> #include <map> #include <chrono> using namespace std; class spender { public:spender(string strfun) :strfun(strfun…

LeetCode算法二叉树—相同的树

目录 100. 相同的树 - 力扣&#xff08;LeetCode&#xff09; 代码&#xff1a; 运行结果&#xff1a; 给你两棵二叉树的根节点 p 和 q &#xff0c;编写一个函数来检验这两棵树是否相同。 如果两个树在结构上相同&#xff0c;并且节点具有相同的值&#xff0c;则认为它们是…

FPGA的DQPSK调制解调Verilog

名称&#xff1a;DQPSK调制解调 软件&#xff1a;Quartus 语言&#xff1a;Verilog 要求&#xff1a; 使用Verilog语言进行DQPSK调制和解调&#xff0c;并进行仿真 代码下载&#xff1a;DQPSK调制解调verilog&#xff0c;quartus_Verilog/VHDL资源下载 代码网&#xff1a;h…

哈希表9.24

13.罗马数字转整数 13. 罗马数字转整数 - 力扣&#xff08;LeetCode&#xff09;https://leetcode.cn/problems/roman-to-integer/?envTypelist&envIdsxrVTWKy目的是将一串罗马数字字符串转为整数 使用哈希存储罗马字母对应的数字可以很方便我们遍历字符串时快速找到对应…

代码随想录Day02 数组基础2 leetcode T977有序数组的平方, T209 长度最小的子数组,T59 螺旋矩阵II

本文思路和详细解答来源于: 代码随想录 视频讲解见: 双指针法经典题目 | LeetCode&#xff1a;977.有序数组的平方_哔哩哔哩_bilibili Leetcode T977 有序数组的平方 题目链接: 977. 有序数组的平方 - 力扣&#xff08;LeetCode&#xff09; 思路1: 暴力求解 这里先解释一下非…