算法——有向图的最短路径算法

2023-11-12

建议学习最短路径算法时,观看这个视频

https://www.bilibili.com/video/BV1q4411M7r9?from=search&seid=9662298119837732890 

Dijkstra算法

思路:

1.从一个单源节点开始计算,寻找当前节点周围没有遍历过并且可到达的邻接点,并且把当前单源节点设置为以访问状态;

2.如果从当前节点到这些邻接点的距离更短,那么更新这些邻接点的父节点数组为当前节点,距离数组为当前节点的距离数组+这些邻接点与当前节点之间弧的权重;

3.并且在遍历当前节点的邻接点的时候,要选出当前节点与这些邻接点之间弧权重最短的那个邻接点作为下一次的单源节点;

4.对下一次的单元节点的操作与上面操作类似;

5.以上操作需要借助队列来实现。

6.关于有向图还要注意i->j的弧,只能由i移动到j

//有向图
#include<iostream>
#include<vector>
#include<queue>
#include<climits>
using namespace std;
//边表节点
typedef struct ArcNode
{
    int Adjvex;
    int wet;
    ArcNode*next=nullptr;
    ArcNode(int x,ArcNode*p,int y):Adjvex(x),next(p),wet(y) {}
} ArcNode;
//顶点表节点
typedef struct VerNode
{
    int Vervex;
    ArcNode*First_Edge;
    VerNode(int x,ArcNode*p):Vervex(x),First_Edge(p) {}
} VerNode;
class d_chart
{
private:
    vector<VerNode*>VerNode_List;
    vector<int>Visited_Mark;
    vector<int>Parent;//存储节点的上一个父亲节点
    vector<int>Distance;//存储源节点到每一个节点的最短距离
public:
    d_chart() {}
    void make(vector<int>data,int Road_Nums);
    void Print();
    void Reset();
    void Dijkstra(int u);
    ~d_chart();
};
void d_chart::make(vector<int>data,int Road_Nums)
{
    VerNode*Node_Pointer_temp;
    ArcNode*Arc_Pointer;
    int i,j,k,w;
    int Data_Len=data.size();
    for(i=0; i<Data_Len; i++)
    {
        Node_Pointer_temp=new VerNode(data[i],nullptr);
        VerNode_List.push_back(Node_Pointer_temp);
        Visited_Mark.push_back(0);
        Parent.push_back(-1);
        Distance.push_back(INT_MAX);
    }
    for(k=0; k<Road_Nums; k++)
    {
        cout<<"请输入有向图的路径i——>j,以及弧的权重"<<endl;
        cout<<"请输入i:  ";
        cin>>i;
        cout<<endl<<"请输入j:  ";
        cin>>j;
        cout<<endl<<"请输入i->j弧的权重";
        cin>>w;
        cout<<endl;
        Arc_Pointer=new ArcNode(j,VerNode_List[i]->First_Edge,w);
        VerNode_List[i]->First_Edge=Arc_Pointer;
    }
}
void d_chart::Print()
{
    ArcNode*s;
    int i;
    for(i=0; i<VerNode_List.size(); i++)
    {
        //cout<<VerNode_List[i]->Vervex;
        s=VerNode_List[i]->First_Edge;
        while(s!=nullptr)
        {
            cout<<" "<<VerNode_List[i]->Vervex<<"——>"<<s->Adjvex<<" ";
            s=s->next;
        }
        cout<<endl;
    }
}
d_chart::~d_chart()
{
    ArcNode*s;
    ArcNode*q;
    int i;
    for(i=0; i<VerNode_List.size(); i++)
    {
        s=VerNode_List[i]->First_Edge;
        delete VerNode_List[i];
        while(s!=nullptr)
        {
            q=s;
            s=s->next;
            delete q;
        }
    }
}
void d_chart::Reset()
{
    int i=0;
    for(i=0; i<Visited_Mark.size(); i++)
    {
        Visited_Mark[i]=0;
        Parent[i]=-1;
        Distance[i]=INT_MAX;
    }
}
void d_chart::Dijkstra(int u)
{
    int node=Parent.size();//节点数
    queue<VerNode*> s;

    s.push(VerNode_List[u]);
    Parent[u]=-1;
    Distance[u]=0;

    while(!s.empty())
    {
        int idx=s.front()->Vervex;
        //cout<<"当前节点——"<<idx<<endl;
        Visited_Mark[idx]=1;
        int last=-1;//记录最后要入队的那个节点的下标
        int last_wt=INT_MAX;
        for(ArcNode*p=VerNode_List[idx]->First_Edge;p!=nullptr;p=p->next)
        {
            int pls=p->Adjvex;
            if(Visited_Mark[pls]==0)//没有被访问过
            {
                //cout<<"可以选择的节点****"<<pls<<endl;
                if(((p->wet)+Distance[idx])<Distance[pls])
                {
                    Distance[pls]=((p->wet)+Distance[idx]);
                    Parent[pls]=idx;
                }
                if((p->wet)<last_wt)
                {
                    last=pls;
                    last_wt=(p->wet);
                }
            }
        }
        //cout<<"最终选择的节点++++"<<last<<endl<<endl;
        if(last!=-1)//如果最终选中的节点下标等于-1,那么说明没有与当前节点相连的节点了
        {
            s.push(VerNode_List[last]);
        }
        s.pop();
    }
    cout<<endl<<"当前的源节点是"<<u<<endl;
    //打印出各个数组存储的数据

    cout<<"Distance数组:"<<endl;
    for(int i=0;i<node;i++)
    {
        cout<<Distance[i]<<" ";
    }
    cout<<endl<<"Parent数组:"<<endl;
    for(int i=0;i<node;i++)
    {
        cout<<Parent[i]<<" ";
    }
}
int main()
{
    vector<int> p={0,1,2,3,4};
    d_chart cool;
    cool.make(p,10);
    cool.Print();
    cool.Dijkstra(0);
    return 0;
}

运行:

说实在的,有向图的Dijkstra算法和无向图的算法步骤大同小异,基本一样。

Floyd算法

思路:

1.使用两个n*n的矩阵Dist,Plain(n是节点的个数),Disti节点到j节点的最短距离,Plain存放的是i到j最短路径的节点遍历顺序,

比如Plain[i][j]=k,那么从i到j的最短路径就要经过k节点,那么就去Plain[k][j]查看Plain[k][j]的值是否为j,如果为,那么最短路径就是

i->k->j,否则就继续像之前那样寻找最短路径上的节点。

 

2.初始换Dist数组,其实就是把邻接表转换成邻接矩阵,从而更好操作,主对角线由于图中弧权重可为负数,所以主对角线上可以初始化为一个极大或者极小的值,然后不相通的两个节点的Dist不能直接设置为INT_MAX,在这上面我吃了大亏,他会整型越界,最好设置为INT_MAX-50

 

3.初始化Plain数组,Plain[i][j]初始化为j,而当i==j的时候,初始化为-1,因为节点中没有-1为下标。

 

4.然后使用三层循环,最外层的k循环,是循环遍历中间节点,内两层循环更新距离数组,如果i先到k这个中间节点在到j节点比之前其他路径更短,那么同时更新路径数组,和顺序数组,很重要的一点在更新的时候,下标为k的行和列以及对角线不参与这种更新。

 

5.最后还有更加重要的一点就是如果i无法到达k的话,就不能更新,因为当k到j的弧的权重为负数的话就会发生非常不好的结果,我深有体会!

 

 

代码

//有向图
#include<iostream>
#include<vector>
#include<queue>
#include<climits>
using namespace std;
//边表节点
typedef struct ArcNode
{
    int Adjvex;
    int wet;
    ArcNode*next=nullptr;
    ArcNode(int x,ArcNode*p,int y):Adjvex(x),next(p),wet(y) {}
} ArcNode;
//顶点表节点
typedef struct VerNode
{
    int Vervex;
    ArcNode*First_Edge;
    VerNode(int x,ArcNode*p):Vervex(x),First_Edge(p) {}
} VerNode;
class d_chart
{
private:
    vector<VerNode*>VerNode_List;//节点
public:
    d_chart() {}
    void make(vector<int>data,int Road_Nums);
    void Print();
    void Floyd();
    ~d_chart();
};
void d_chart::make(vector<int>data,int Road_Nums)
{
    VerNode*Node_Pointer_temp;
    ArcNode*Arc_Pointer;
    int i,j,k,w;
    int Data_Len=data.size();
    for(i=0; i<Data_Len; i++)
    {
        Node_Pointer_temp=new VerNode(data[i],nullptr);
        VerNode_List.push_back(Node_Pointer_temp);
        Visited_Mark.push_back(0);
        Parent.push_back(-1);
        Distance.push_back(INT_MAX);
    }
    for(k=0; k<Road_Nums; k++)
    {
        cout<<"请输入有向图的路径i——>j,以及弧的权重"<<endl;
        cout<<"请输入i:  ";
        cin>>i;
        cout<<endl<<"请输入j:  ";
        cin>>j;
        cout<<endl<<"请输入i->j弧的权重";
        cin>>w;
        cout<<endl;
        Arc_Pointer=new ArcNode(j,VerNode_List[i]->First_Edge,w);
        VerNode_List[i]->First_Edge=Arc_Pointer;
    }
}
void d_chart::Print()
{
    ArcNode*s;
    int i;
    for(i=0; i<VerNode_List.size(); i++)
    {
        //cout<<VerNode_List[i]->Vervex;
        s=VerNode_List[i]->First_Edge;
        while(s!=nullptr)
        {
            cout<<" "<<VerNode_List[i]->Vervex<<"——>"<<s->Adjvex<<" ";
            s=s->next;
        }
        cout<<endl;
    }
}
d_chart::~d_chart()
{
    ArcNode*s;
    ArcNode*q;
    int i;
    for(i=0; i<VerNode_List.size(); i++)
    {
        s=VerNode_List[i]->First_Edge;
        delete VerNode_List[i];
        while(s!=nullptr)
        {
            q=s;
            s=s->next;
            delete q;
        }
    }
}
void d_chart::Floyd()
{
    int node=Parent.size();
    //Floyd算法所需数组
    vector<vector<int>>Dist(node,vector<int>(node,INT_MAX-50));//距离数组
    vector<vector<int>>Plain(node,vector<int>(node));//顺序数组

    //初始化顺序数组
    for(int i=0; i<node; i++)
        for(int j=0; j<node; j++)
        {
            if(i==j)
            {
                Plain[i][j]=-1;
            }
            else
            {
                Plain[i][j]=j;
            }
        }

    /*先打印初始化的顺序数组*/
    cout<<"——初始化的顺序数组——"<<endl;
    for(int i=0; i<node; i++)
    {
        for(int j=0; j<node; j++)
            cout<<Plain[i][j]<<"  ";
        cout<<endl;
    }
    //初始化距离数组
    for(int i=0; i<node; i++)
    {
        int x=VerNode_List[i]->Vervex;
        for(ArcNode*p=VerNode_List[i]->First_Edge; p!=nullptr; p=p->next)
        {
            int y=p->Adjvex;
            Dist[x][y]=p->wet;
        }
    }


    //距离数组对角线
    for(int i=0; i<node; i++)
        for(int j=0; j<node; j++)
        {
            if(i==j)
                Dist[i][j]=0;
        }
    /*打印初始化的距离数组*/
    cout<<"——初始化的距离数组——"<<endl;
    for(int i=0; i<node; i++)
    {
        for(int j=0; j<node; j++)
        {
            if(i==j)
            {
                cout<<"-  ";
                continue;
            }
            if(Dist[i][j]==(INT_MAX-50))//
                cout<<"∞"<<"  ";
            else
                cout<<Dist[i][j]<<"  ";
        }
        cout<<endl;
    }

    //三层循环
    for(int k=0; k<node; k++)
    {
        for(int i=0; i<node; i++)
        {
            if(i==k)
                continue;
            for(int j=0; j<node; j++)
            {
                if(j==k)
                    continue;
                if(i==j)
                    continue;

                /*cout<<"Dist["<<i<<"]["<<k<<"]: ";
                if(Dist[i][k]==INT_MAX-50)
                    cout<<"∞"<<"  ";
                else
                    cout<<Dist[i][k]<<"  ";
                cout<<"Dist["<<k<<"]["<<j<<"]:  ";
                if(Dist[k][j]==INT_MAX-50)
                    cout<<"∞"<<"  ";
                else
                    cout<<Dist[k][j]<<"  ";
                cout<<"Dist["<<i<<"]["<<j<<"]:  ";
                if(Dist[i][j]==INT_MAX-50)
                    cout<<"∞"<<"  ";
                else
                    cout<<Dist[i][j]<<"  ";
                    cout<<endl;*/



                if((Dist[i][k]+Dist[k][j])<Dist[i][j]&&(Dist[i][k]!=(INT_MAX-50)&&Dist[k][j]!=(INT_MAX-50)))//
                {
                    Dist[i][j]=(Dist[i][k]+Dist[k][j]);
                    Plain[i][j]=Plain[i][k];
                }
            }
        }
        cout<<"——中间节点为"<<k<<"之后距离矩阵的更新——"<<endl;
        for(int i=0; i<node; i++)
        {
            for(int j=0; j<node; j++)
            {
                if(i==j)
                {
                    cout<<"-  ";
                    continue;
                }
                if(Dist[i][j]==INT_MAX-50)
                    cout<<"∞"<<"  ";
                else
                    cout<<Dist[i][j]<<"  ";
            }
            cout<<endl;
        }

    }

    //打印距离数组
    cout<<"——距离数组——"<<endl;
    for(int i=0; i<node; i++)
    {
        for(int j=0; j<node; j++)
        {
            if(i==j)
            {
                cout<<"-  ";
                continue;
            }
            if(Dist[i][j]==INT_MAX-50)
                cout<<"∞"<<"  ";
            else
                cout<<Dist[i][j]<<"  ";
        }
        cout<<endl;
    }


    //打印顺序数组
    cout<<"——顺序数组——"<<endl;
    for(int i=0; i<node; i++)
    {
        for(int j=0; j<node; j++)
            cout<<Plain[i][j]<<"  ";
        cout<<endl;
    }
}
int main()
{
    vector<int> p= {0,1,2,3,4};
    d_chart cool;
    cool.make(p,9);
    cool.Print();
    cool.Floyd();
    return 0;
}

 

基本公式:

测试用图:


 

 

 

 

程序运行:

 

 

 

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

算法——有向图的最短路径算法 的相关文章

  • 【Leetcode】44. 二叉树的前序遍历

    题目描述 题解 递归法 执行用时 0 ms 在所有 Java 提交中击败了100 00 的用户 内存消耗 36 7 MB 在所有 Java 提交中击败了38 60 的用户 Definition for a binary tree node
  • [Go版]算法通关村第二关白银——两两交换链表中的节点问题解析

    目录 题目 两两交换链表中的节点 解决方法 思路分析 Go代码 画图说明 题目 两两交换链表中的节点 题目链接 LeetCode 24 两两交换链表中的节点 解决方法 源码地址 GitHub golang版本 思路分析 让虚拟头结点指向链表
  • 【Leetcode】107. 二叉树的层序遍历 II

    题目描述 题解 很简单 分层的层序遍历 并且插入List
  • 【Leetcode】257. 二叉树的所有路径

    题目描述 题解 能用String解决的最好不要走StringBuilder 递归时注意空结点 null 回退和叶子结点判定回退 执行用时 9 ms 在所有 Java 提交中击败了30 66 的用户 内存消耗 39 1 MB 在所有 Java
  • 散列表习题

    1 考虑key的集合S 0 8 16 24 32 40 48 56 64 用除余法构造的散列函数 h1 key key 12 h2 key key 11 h1将S映射到的值域有几个元素 3 h2将S映射到的值域有几个元素 9 2 散列表的规
  • 【C++后台开发面试】STL相关

    此部分较为精简 只供面试前联想记忆使用 需要先熟读相关的内容知识才能发挥其作用 推荐书籍 STL源码剖析 侯捷 六大组件及其关系 空间配置器 容器 迭代器 算法 仿函数 适配器 内存管理 内存配置和对象构造 析构分开 使用双层级配置器 第一
  • LeetCode-1606. 找到处理最多请求的服务器、C++中优先队列的使用

    你有 k 个服务器 编号为 0 到 k 1 它们可以同时处理多个请求组 每个服务器有无穷的计算能力但是 不能同时处理超过一个请求 请求分配到服务器的规则如下 第 i 序号从 0 开始 个请求到达 如果所有服务器都已被占据 那么该请求被舍弃
  • 什么是lambda函数?使用lambda函数有什么好处?

    一 什么是lambda函数 Python支持一种有趣的语法 它允许你快速定义单行的最小函数 这些叫做lambda的函数是从Lisp中借用来的 可以被用在任何需要函数的地方 lambda 函数是一个可以接收任意多个参数 包括可选参数 并且返回
  • 力扣刷题-210.课程表Ⅱ、图的表示方式、BFS

    一 图的基本概念 定义和基本术语 图是由节点以及连接这些节点边组成 无向图 每条边连接的两个节点可以双向访问 有向图 每条边连接的两个节点只能单向访问 出度 有向图的某个节点作为起点的次数和 入度 有向图的某个节点作为终点的次数和 权重 图
  • 算法训练营day48

    文章目录 198 打家劫舍 思路分析 代码实现 思考总结 213 打家劫舍II 思路分析 代码实现 337 打家劫舍 III 树形DP 思路分析 代码实现 思考总结 198 打家劫舍 题目链接 你是一个专业的小偷 计划偷窃沿街的房屋 每间房
  • Java中Arrays类的常用方法

    Java中Arrays类的常用方法 Arrays类位于 java util 包中 主要包含了操作数组的各种方法 import java util Arrays Arrays fill 填充数组 int arr new int 5 新建一个大
  • 【剑指offer】数据结构——数

    目录 数据结构 数 直接解 剑指offer 43 1 n 整数中 1 出现的次数 剑指offer 44 数字序列中某一位的数字 剑指offer 49 丑数 剑指offer 60 n个骰子的点数 剑指offer 62 圆圈中最后剩下的数字 剑
  • 【Leetcode】154. 寻找旋转排序数组中的最小值 II

    题目描述 已知一个长度为 n 的数组 预先按照升序排列 经由 1 到 n 次 旋转 后 得到输入数组 例如 原数组 nums 0 1 4 4 5 6 7 在变化后可能得到 若旋转 4 次 则可以得到 4 5 6 7 0 1 4 若旋转 7
  • 算法训练day43

    文章目录 1049 最后一块石头的重量 II 求最大重量 思路分析 代码实现 494 目标和 求组合方法数 思路分析 动规方法 代码实现 总结思考 474 一和零 求二维背包的最大物品数 思路分析 代码实现 思考总结 1049 最后一块石头
  • 剖析高性能队列Disruptor背后的数据结构和算法

    本文是学习算法的笔记 数据结构与算法之美 极客时间的课程 Disruptor 是一种内存消息队列 它经Java 中另外一个非常常用的内存消息队列 ArrayBlockQueue ABS 的性能 要高出一个数量级 可以算得上是最快的内存消息队
  • 算法:2-3平衡树与B树的详细探讨

    2 3树是最简单的B树 B 树是B树的升级 B树的来源 为什么要有树 描述 1 多 N M 层次等关系 从最根本的原因来看 使用树结构是为了提升整体的效率 插入 删除 查找 索引 尤其是索引操作 因为相比于链表 一个平衡树的索引时间复杂度是
  • 二叉查找树(BST)的基本概念及常用操作

    二叉查找树 二叉查找树 Binary Search Tree 也称二叉搜索树 有序二叉树 ordered binary tree 排序二叉树 orted binary tree 是指一棵空树或者具有下列性质的二叉树 若任意节点的左子树不空
  • 【数据结构】Binary Search Tree(BST) 二分搜索树

    数据结构源码 实现类 import java util import java util LinkedList import java util Queue import java util Stack 二分搜素树 BST param
  • 【LeetCode刷题笔记】位运算

    231 2 的幂 解题思路 1 除法 不断循环判断 如果能被 2 整除 就不断除以 2 直到不能被 2 整除为止 最后结果如果是 1
  • 【LeetCode刷题笔记】位运算

    231 2 的幂 解题思路 1 除法 不断循环判断 如果能被 2 整除 就不断除以 2 直到不能被 2 整除为止 最后结果如果是 1

随机推荐

  • -bash:findstr: command not found

    项目场景 在CentOS7 6 上部署公司的一个系统 问题描述 执行命令报错 keytool list keystore app jdk11Openj9 lib security cacerts storepass changeit fin
  • Centos7安装Gitlab

    安装GithLab 1 安装必要依赖 sudo yum install y curl policycoreutils python openssh server perl sudo systemctl enable sshd sudo sy
  • Sublime text 3 如何格式化HTML/css/js代码

    使用Sublime text 3 编写代码是一种享受 使用Sublime text 3 格式化HTML代码 需要安装插件 具体安装步骤如下 1 打开菜单 gt 首选项 gt 插件控制 输入 install package 2 等待程序进入插
  • DoS攻击

    原文 1 DoS攻击 DoS攻击 Denial of Service 拒绝服务攻击 通过消耗计算机的某种资源 例如计算资源 网络连接等 造成资源耗尽 导致服务端无法为合法用户提供服务或只能提供降级服务 在SDN网络的集中式架构中 控制器是天
  • 医学图像分割评判标准及程序代码

    文章目录 1 图像分割指标 2 两个问题 3 IOU和假阳性率 4 准确率 Accuracy 精确率 Precision 召回率 Recall 和F1 Measure 参考资源 1 https blog csdn net zichen zi
  • 关于获取项目在tomcat中的路径问题

    1 直接发请求 可以用下面的方式 ServletContext context ServletRequestAttributes RequestContextHolder getRequestAttributes getRequest ge
  • 如何安装管式土壤墒情监测仪?

    安装说明 在安装时 需选择地势相对较高且平坦的位置进行安装 这样即能防止雨水倒灌进设备内部从而引起设备短路或线路故障 还能保证监测数据的精准度 首先 我们先使用土钻竖直于地面进行打孔保证传感器放入 取出都比较顺畅 直到孔深与传感器所标识的安
  • 程序员如何培养领导力

    第一阶段 熟悉自己的业务 知道问题在哪里 怎样可以解决 领导者是给大家指方向的 你必须先知道要走哪个方向 才能带领别人 这是领导力的基础 第二阶段 培养说服能力 能说服他人 问题可以按照你说的方式解决 领导力的表现是 他人愿意服从你 这不能
  • 比较流行的编程语言

    流行的编程语言 1 C C语言诞生于1972年 可以称之为现代高级语言的鼻祖 由著名的贝尔实验室发明 C语言是人们追求结构化 模块化 高效率的 语言之花 在底层编程 比如嵌入式 病毒开发等应用 可以替代汇编语言来开发系统程序 在高层应用 也
  • MOS管应用之外接电源和电池供电的的双电源自动切换电路

    现在大部分电子产品都配有锂电池 在没有外接电源的时候 使用锂电池进行供电 当外接电源的时候 使用外部电源供电 同时对锂电池充电 因此要求电路必须具备能够根据是否接有外部电源 而自动选择相应供电电源的能力 常见的简单电源切换电路如图1所示 但
  • 16.echarts X轴像直尺一样设置刻度

    在做老师的项目的时候 老师让我们实现X轴的直尺刻度显示 网上查了查相关代码 大家都没有明确介绍 因此我在这里记录一下 自己的学习 先看实现效果 对echarts的xAxis yAxis这两个属性进行修改即可实现 xAxis 第一个 是原X轴
  • nodeMCU(ESP8266)和RC522的接线图

    文章目录 nodeMCU ESP8266 和RC522的接线图 参考文章 nodeMCU引脚图 nodeMCU 和 RC522接线图 示例代码 nodeMCU ESP8266 和RC522的接线图 参考文章 这篇应该是别人从国外论坛翻译过来
  • 腾讯翻译软件推荐

    相信大家学编程的时候 经常会需要进行官方文档的查阅 但是大部分的官方文档都是英文的 对于英文不是很好的朋友不是很友好 当然 如果英文较好的朋友最好尝试看英文 毕竟在写代码的时候翻译软件会把代码中的英文也翻译出来 下面我推荐一款腾讯翻译软件给
  • Web前端——HTML中的列表、表格、表单

    一 列表
  • 数据挖掘与数据分析的主要区别

    本文来自网易云社区 百科是这样定义数据挖掘和数据分析的 数据分析 是指用适当的统计分析方法对收集来的大量数据进行分析 提取有用信息和形成结论而对数据加以详细研究和概括总结的过程 这一过程也是质量管理体系的支持过程 在实用中 数据分析可帮助人
  • Java集合框架之Set集合简介

    和List集合一样 Set集合也是属于单列集合 同属于Collcetion集合体系下 List和Set都是单列集合 但是他们是存在区别的 List 有序 元素可重复的单列集合 Set 无序 元素不可重复的单列集合 Set和List集合一样属
  • idea移除许可证

    目录 一 介绍 二 操作步骤 一 介绍 当自己的idea日期要到了 又想续上 但是覆盖不了之前的日期 新的没办法生效 那么就要把原先的许可证先移除 再重新续上新的 二 操作步骤 1 点击idea的右上角的这个展开 2 选择帮助 点击注册 3
  • 算法➡数学问题

    文章目录 进制转换 最大公约数与最小公倍数 最大公约数 素数 判断素数 素数表的获取 质因子分解 大数运算 大数乘法 几何问题 由三点的坐标求所构成的三角形的面积 判断点是否在三角形内 集合问题 子集问题 数学归纳法 回溯法 全排列 进制转
  • 面试经典(5)--二叉树最低公共祖先LCA

    题目 输入二叉树的俩个节点 求它们的最低公共祖先 算法分析 我们直接来分析O n 的算法 比如求节点F和节点H的最低公共祖先 先求出从根节点A到F的路径 再求出A到H的路径 那么最后一个相同的节点就是最低公共祖先 A gt B gt D g
  • 算法——有向图的最短路径算法

    建议学习最短路径算法时 观看这个视频 https www bilibili com video BV1q4411M7r9 from search seid 9662298119837732890 Dijkstra算法 思路 1 从一个单源节