编程语言
首页 > 编程语言> > 算法特别篇_强大的static_注重细节的百倍优化(LeetCode_839_相似字符串组)

算法特别篇_强大的static_注重细节的百倍优化(LeetCode_839_相似字符串组)

作者:互联网

算法特别篇_强大的static优化

:思来想去,果然还是有必要记录一下这见证历史的时刻!学c++也有点时间了,关于代码基础细节反面,一直没有切身体会过有多大的影响。今天借这份每日一题记录一下细节上的百倍优化。
来源:力扣(LeetCode)
链接:LeetCode_839_相似字符串组

故事开始

首先题目

我打开力扣看到了今天的每日一题,又是困难,又是并查集,大体思路并不难,不会并查集的hxd去隔壁博客康康算法特别篇_并查集思路(LeetCode_778_水位上升的泳池中游泳) 。嗯,那我先把题扔上来。

然后AC这道题目

下来我就动手了,很快啊!直接搓了一个并查集,给他ac了,但是效率感人(如下图),我刷力扣以来第一次这么惨淡,虽然ac了,但是伤害不高羞辱性极强。我能忍吗,我不能,我得优化它。在这里插入图片描述

这边先贴一下最开始用的那份代码

class UnionFind
{
public:
    vector<int> parents;
    int count = 0;
    UnionFind(int n)
    {
        count = n;
        for(int i = 0;i<n;i++)
        {
            parents.push_back(i);
        }
    }
    int Find(int x)
    {  
        if(parents[x]==x) return x;
        return Find(parents[x]);
    }
    void marge(int x,int y)
    {
        if(Find(x)!=Find(y))
        {
            parents[Find(x)] = Find(y);
            count--;
        }
    }
};
class Solution {
public:
    int numSimilarGroups(vector<string>& strs) {
        UnionFind uf(strs.size());
        for(int i = 0;i<strs.size();i++)
            for(int j = i+1;j<strs.size();j++)
                if(strResemble(strs[i],strs[j])) uf.marge(i,j);
        return uf.count;
    }
    bool strResemble(string& a,string& b)
    {
        vector<int> ve;
        for(int i = 0;i<a.length();i++)
        {
            if(a[i]!=b[i])
            {
                ve.push_back(i);
            }
        }
        if(ve.size()==0) return true;
        if(ve.size()!=2) return false;
        if(a[ve[0]]==b[ve[1]]&&a[ve[1]]==b[ve[0]]) return true;
        return false;
    }
};

接着优化我的效率

class UnionFind
{
public:
    vector<int> parents;
    int count = 0;
    UnionFind(int n)
    {
        count = n;
        parents = vector<int>(n);
        for(int i = 0;i<n;i++)
        {
            parents[i] = i;
        }
    }
    int Find(int& x)
    {  
        if(parents[x]==x) return x;
        return Find(parents[x]);
    }
    void marge(int& x,int& y)
    {
        if(Find(x)!=Find(y))
        {
            parents[Find(x)] = Find(y);
            count--;
        }
    }
};
class Solution {
public:
    int numSimilarGroups(vector<string>& strs) {
        UnionFind uf(strs.size());
        for(int i = 0;i<strs.size();i++)
            for(int j = i+1;j<strs.size();j++)
                if(strResemble(strs[i],strs[j])) uf.marge(i,j);
        return uf.count;
    }
    bool strResemble(string& a,string& b)
    {
        static int p[2];
        static int boo;
        boo = 0;
        for(int i = 0;i<a.length();i++)
        {
            if(a[i]!=b[i])
            {
                if(boo>1) return false;
                p[boo] = i;
                boo++;
            }
        }
        if(boo==0) return true;
        if(boo==1) return false;
        if(a[p[0]]==b[p[1]]&&a[p[1]]==b[p[0]]) return true;
        return false;
    }
};

标签:特别篇,int,839,parents,strs,vector,static,return,Find
来源: https://blog.csdn.net/weixin_44579240/article/details/113470428