图论第8天

685.冗余连接II

这题需要考虑两种情况:

1.两个输入

2.没有两个输入就是有成环

cpp 复制代码
class Solution
{
public:
    static const int N = 1005;
    int father[N];
    int n;
    void init()
    {
        for (int i = 0; i <= n; i++)
        {
            father[i] = i;
        }
    }
    int find(int x)
    {
        return x == father[x] ? x : father[x] = find(father[x]);
    }
    int isSame(int a, int b)
    {
        a = find(a);
        b = find(b);
        return (a == b);
    }
    void join(int a, int b)
    {
        a = find(a);
        b = find(b);
        if (a == b)
            return;
        father[b] = a;
    }
    bool lianggeshuru(vector<vector<int>> &edges, int deleteNode)
    {
        init();
        for (int i = 0; i < edges.size(); i++)
        {
            if (i == deleteNode)
                continue;
            if (isSame(edges[i][0], edges[i][1]))
            {
                return false;
            }
            join(edges[i][0], edges[i][1]);
        }
        return true;
    }
    vector<int> huan(vector<vector<int>> &edges)
    {
        init();
        for (int i = 0; i < n; i++)
        {
            if (isSame(edges[i][0], edges[i][1]))
                return edges[i];
            join(edges[i][0], edges[i][1]);
        }
        return {};
    }
    vector<int> findRedundantDirectedConnection(vector<vector<int>> &edges)
    {
        n = edges.size();
        int count[N] = {0};
        // 有两个输入
        for (int i = 0; i < n; i++)
        {
            count[edges[i][1]]++;
        }
        vector<int> vec;
        for (int i = n - 1; i >= 0; i--)
        {
            if (count[edges[i][1]] == 2)
            {
                vec.push_back(i);
                cout << i << endl;
            }
        }
        if (vec.size() > 0)
        {
            if (lianggeshuru(edges, vec[0]))
            {
                return edges[vec[0]];
            }
            else
            {
                return edges[vec[1]];
            }
        }
        // 有环
        return huan(edges);
    }
};

默写一遍再。其实突然就对这行代码不理解了,需要做个小实验。其实就是后面可以跟一个等式。

cpp 复制代码
    int find(int x)
    {
        return x == father[x] ? x : father[x] = find(father[x]);
    }

挺好挺好,默写出来啦!!!思路很重要!!!

cpp 复制代码
class Solution {
public:
    static const int N = 1005;
    int father[N] = {0};
    void init(int num){
        for(int i = 0;i < num;i++){
            father[i] = i;
        }
    }
    int find(int x){
        return x == father[x] ? x : father[x] = find(father[x]);
    }
    bool isSame(int a,int b){
        a = find(a);
        b = find(b);
        return (a == b);
    }
    void join(int a ,int b){
        a = find(a);
        b = find(b);
        if(a == b)return;
        father[b] = a;
    }
    bool liashuru(vector<vector<int>>& edges,int deleteNode){
        init(edges.size());// because 1 <= ui, vi <= n
        for(int i = 0;i< edges.size();i++){
            if(i == deleteNode)continue;
            if(isSame(edges[i][0],edges[i][1])){
                return false;
            }
            join(edges[i][0],edges[i][1]);
        }
        return true;
    }
    vector<int> huan(vector<vector<int>>& edges){
        init(edges.size());// because 1 <= ui, vi <= n
        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 {};
    }
    vector<int> findRedundantDirectedConnection(vector<vector<int>>& edges) {
        int n = edges.size();
        int count[N] = {0};
        for(int i = 0;i < n;i++){
            count[edges[i][1]]++;
        }
        vector<int>vec;
        for(int i = n-1;i>=0;i--){
            if(count[edges[i][1]] == 2){
                vec.push_back(i);
            }
        }
        //俩输入
        if(vec.size() > 0){
            if(liashuru(edges,vec[0])){
                return edges[vec[0]];
            }else{
                return edges[vec[1]];
            }
        }
        //有环
        return huan(edges);
    }
};

那明天开始做面试题。

相关推荐
智者知已应修善业1 小时前
【求中位数】2024-1-23
c语言·c++·经验分享·笔记·算法
地平线开发者1 小时前
PTQ 量化数值范围与优化
算法·自动驾驶
sali-tec1 小时前
C# 基于halcon的视觉工作流-章68 深度学习-对象检测
开发语言·算法·计算机视觉·重构·c#
测试人社区-小明2 小时前
智能弹性伸缩算法在测试环境中的实践与验证
人工智能·测试工具·算法·机器学习·金融·机器人·量子计算
罗西的思考2 小时前
【Agent】MemOS 源码笔记---(5)---记忆分类
人工智能·深度学习·算法
qq_433554545 小时前
C++数位DP
c++·算法·图论
AshinGau5 小时前
Softmax 与 交叉熵损失
神经网络·算法
似水এ᭄往昔6 小时前
【C++】--AVL树的认识和实现
开发语言·数据结构·c++·算法·stl
栀秋6666 小时前
“无重复字符的最长子串”:从O(n²)哈希优化到滑动窗口封神,再到DP降维打击!
前端·javascript·算法
xhxxx6 小时前
不用 Set,只用两个布尔值:如何用标志位将矩阵置零的空间复杂度压到 O(1)
javascript·算法·面试