图论第三天|127. 单词接龙 841.钥匙和房间 463. 岛屿的周长 1971. 寻找图中是否存在路径 684.冗余连接 685.冗余连接II

news/2024/7/15 20:13:05 标签: 图论, 深度优先, 算法

目录

  • Leetcode127. 单词接龙
  • Leetcode841.钥匙和房间
  • Leetcode463. 岛屿的周长
  • Leetcode1971. 寻找图中是否存在路径
  • Leetcode684.冗余连接
  • Leetcode685.冗余连接II

Leetcode127. 单词接龙

文章链接:代码随想录
题目链接:127. 单词接龙

思路:广搜搜出来直接就是最短路径,深搜还需要判断;广搜相当于先把这一层路径的单词下一步走法都扫出来再走下一步;而深搜找到一条路径就先走到头,再返回来走下一条路径,需要判断路径长度,麻烦
另外需要标记位,wordMap,避免死循环

class Solution {
public:
    int ladderLength(string beginWord, string endWord, vector<string>& wordList) {
        unordered_set<string> wordSet(wordList.begin(), wordList.end());

        if (wordSet.find(endWord) == wordSet.end()) return 0;

        unordered_map<string, int> wordMap;

        wordMap.insert(pair<string, int>(beginWord, 1));

        queue<string> que;
        que.push(beginWord);

        while(!que.empty()){
            string word = que.front();
            que.pop();
            int path = wordMap[word];
            for (int i = 0; i < word.size(); i++){
                string newword = word;
                for (int j = 0; j < 26; j++){
                    newword[i] = j + 'a';
                    if (newword == endWord) return path + 1;
                    if (wordSet.find(newword) != wordSet.end() && wordMap.find(newword) == wordMap.end()) {
                        wordMap.insert(pair<string, int>(newword, path + 1));
                        que.push(newword);
                    }


                }
            }
        }
        return 0;
    }
};

Leetcode841.钥匙和房间

文章链接:代码随想录
题目链接:841.钥匙和房间

思路:dfs

class Solution {
public:
    void dfs(vector<vector<int>>& rooms, vector<bool>& visited, int key){
        if (visited[key]) return;
        visited[key] = true;

        for (int i : rooms[key]){
            dfs(rooms, visited, i);
        }
    }
    
    bool canVisitAllRooms(vector<vector<int>>& rooms) {
        vector<bool> visited(rooms.size(), false);
        dfs(rooms, visited, 0);


        for(int i : visited){
            if (i == false) return false;
        }
        return true;
    }
};

Leetcode463. 岛屿的周长

文章链接:代码随想录
题目链接:463. 岛屿的周长

思路:不用深搜或广搜,遍历就好,不要想复杂。

class Solution {
public:
    int count = 0;
    int dir[4][2] = {1, 0, -1, 0, 0, 1, 0, -1};    
    
    int islandPerimeter(vector<vector<int>>& grid) {
        int m = grid.size();
        int n = grid[0].size();

        for (int i = 0; i < m; i++){
            for (int j = 0; j < n; j++){
                if (grid[i][j] == 1){
                    for (int k = 0; k < 4; k++){

                        int nex = i + dir[k][0];
                        int ney = j + dir[k][1];

                        if (nex < 0 || nex >= grid.size() || ney < 0 || ney >= grid[0].size() || grid[nex][ney] == 0){
                            count++;
                        }
                    }
                }
            }
        }
        return count;
    }
};

Leetcode1971. 寻找图中是否存在路径

文章链接:代码随想录
题目链接:1971. 寻找图中是否存在路径

思路:并查集入门

class Solution {
private:
    int n = 200005;
    vector<int> father = vector<int> (n);

    void init(){
        for (int i = 0; i < n; i++) father[i] = i;
    }

    int find(int u){
        return u == father[u] ? u : father[u] = find(father[u]);
    }

    bool isSame(int u, int v){
        u = find(u);
        v = find(v);
        return u == v;
    }

    void join(int u, int v){
        u = find(u);
        v = find(v);
        if (u == v) return ;
        father[v] = u;
    }


public:
    bool validPath(int n, vector<vector<int>>& edges, int source, int destination) {
        init();
        for (int i = 0; i < edges.size(); i++){
            join(edges[i][0], edges[i][1]);
        }
        return isSame(source, destination);
    }
};

Leetcode684.冗余连接

文章链接:代码随想录
题目链接:684.冗余连接

思路:并查集入门,用于解决无向有环图问题

class Solution {
private:
    int n = 1005;
    vector<int> father = vector<int>(n);

    void init(){
        for (int i = 0; i < n; i++){
            father[i] = i;
        }
    }

    int find (int u){
        return u == father[u] ? u : father[u] = find(father[u]);
    }

    bool isSame(int u, int v){
        u = find(u);
        v = find(v);
        return u == v;
    }

    void join(int u, int v){
        u = find(u);
        v = find(v);
        if (u == v) return ;
        father[u] = v;
    }

public:
    vector<int> findRedundantConnection(vector<vector<int>>& edges) {
        init();
        for (int i = 0; i < edges.size(); i++){
            if (isSame(edges[i][0], edges[i][1])) return edges[i];
            else join(edges[i][0], edges[i][1]);
        }
        return {};
    }
};

Leetcode685.冗余连接II

文章链接:代码随想录
题目链接:685.冗余连接II

思路:将有向图问题拆解成两个无向图有环问题。
另外注意const int n = 1005; n前需加const,否则用n初始化数组会报错,因为n 是一个可变的值

class Solution {
private:
    const int n = 1005;
    vector<int> father = vector<int>(n);
    
    void init(){
        for (int i = 0; i < n; i++){
            father[i] = i;
        }
    }

    int find(int u){
        return u == father[u] ? u : father[u] = find(father[u]);
    }

    bool isSame(int u, int v){
        u = find(u);
        v = find(v);
        return u == v;
    }

    void join(int u, int v){
        u = find(u);
        v = find(v);
        if (u == v) return;
        father[v] = u;
    }

    vector<int> getRemoveEdge(const vector<vector<int>>& edges){
        init();
        for (int i = 0; i < edges.size(); i++){
            if (isSame(edges[i][0], edges[i][1])) return edges[i];
            join(edges[i][0], edges[i][1]);
        }
        return {};
    }

    bool isTree(const vector<vector<int>>& edges, int i){
        init();
        for (int j = 0; j < edges.size(); j++){
            if (j == i) continue;
            if (isSame(edges[j][0], edges[j][1])) return false;
            join(edges[j][0], edges[j][1]);
        }
        return true;
    }

public:
    vector<int> findRedundantDirectedConnection(vector<vector<int>>& edges) {
        int inDegree[1005] = {0};
        for (int i = 0; i < edges.size(); i++){
            inDegree[edges[i][1]]++;
        }

        vector<int> vec;

        for (int i = edges.size() - 1; i >= 0; i--){
            if(inDegree[edges[i][1]] == 2) vec.push_back(i);
        }

        if (vec.size() > 0){
            if (isTree(edges, vec[0])) return edges[vec[0]];
            else return edges[vec[1]];
        }

        return getRemoveEdge(edges);
    }
};

图论第三天打卡,目前随想录上的图论问题刷完,加油!!!


http://www.niftyadmin.cn/n/5352953.html

相关文章

Hbase-2.4.11_hadoop-3.1.3集群_大数据集群_SSH修改默认端口22为其他端口---记录025_大数据工作笔记0185

其实修改起来非常简单,但是在大数据集群中,使用到了很多的脚步,也需要修改, 这里把,大数据集群,整体如何修改SSH端口,为22022,进行总结一下: 0.hbase-2.4.11的话,hbase集群修改默认SSH端口22,修改成22022,需要修改 需要修改/opt/module/hbase-2.4.11/conf/hbase-env.sh 这里…

【PostGIS】POSTGIS实现聚类统计提取外轮廓

项目需求根据某些条件进行聚类统计&#xff0c;然后返回聚类的外轮廓&#xff0c;这里主要用到POSTGIS的两个算法&#xff0c;一个是聚类统计功能&#xff0c;一个是提取外轮廓的功能。 1. 聚类统计 Postgis主要实现并提供了四种聚类方法&#xff0c;前两个为窗口函数&#x…

RabbitMQ基础编程模型及详细使用

目录 RabbitMQ基础编程模型 引入依赖 创建连接&#xff0c;获取Channel 声明Exchange-可选 声明queue 声明Exchange与Queue的绑定关系-可选 Producer根据应用场景发送消息到queue Consumer消费消息 Consumer主要有两种消费方式 1、被动消费模式 2、主动消费模式 完成…

搭建gitlab仓库

yum安装gitlab仓库 搭建gitlab仓库 配置yum源 vim /etc/yum.repos.d/gitlab-ce.repo [gitlab-ce] namegitlab-ce baseurlhttps://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el7 gpgcheck0 Repo_gpgcheck0 Enabled1 Gpgkeyhttps://packages.gitlab.com/gpg.keysudo yum ins…

selenium总结-css 定位高级语法

文章目录 推荐的定位方式的优先级定位元素的注意事项&#xff08;划重点&#xff09;CSS选择器组成id 选择器class 选择器标签选择器分组选择器属性选择器组合选择符伪类最佳实践 推荐的定位方式的优先级 优先级最高&#xff1a;ID优先级其次&#xff1a;name优先级再次&#…

SpringBoot之@RequestParam注解

RequestParam &#xff08;org.springframework.web.bind.annotation.RequestParam&#xff09;用于将指定的请求参数赋值给方法中的形参。 有三个属性&#xff1a; &#xff08;1&#xff09;value&#xff1a;请求参数名&#xff08;必须配置&#xff09; &#xff08;2&…

【Qt 多线程+opencv 读取和显示图像】

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言工程需要Qt多线程opencv 结合信号与槽读取和显示图像 一、例程二、线程的开启和关闭三、判断线程是否还在运行总结 前言 提示&#xff1a;这里可以添加本文要记…

R语言(数据导入,清洗,可视化,特征工程,建模)

记录一下痛失的超级轻松的数据分析实习&#xff08;线上&#xff09;&#xff0c;hr问我有没有相关经历&#xff0c;我说我会用jupyter book进行数据导入&#xff0c;清洗&#xff0c;可视化&#xff0c;特征工程&#xff0c;建模&#xff0c;python学和用的比较多&#xff0c;…