leetcode 997. 找到小镇的法官

  打了两种解法。

  一开始我的想法和图论无关。由题意得,法官不指向任何人,但任何人都指向法官,且只有一个法官——即只有法官不信任任何人。因此我遍历一次找这个不信任任何人的人(这个人只能有一个,否则return -1),然后检查一遍是否每个人都信任他。时间复杂度$O(n)$。

bool flag[1007];
bool tag[1007][1007];

class Solution {
public:
    int findJudge(int n, vector<vector<int>>& trust) {
        memset(flag,0,sizeof(flag));
        memset(tag,0,sizeof(tag));
        int ans=0;
        int t=trust.size();
        for (int i=0;i<t;i++)   // record whether one has someone to trust
            flag[trust[i][0]]=true,tag[trust[i][0]][trust[i][1]]=true;
        for (int i=1;i<=n;i++)  // find possible judge
            if (!flag[i]){
                if (ans)
                    return -1;
                else
                    ans=i;
            }
        if (!ans)       // no judge
            return -1;
        else{
            for (int i=1;i<=n;i++)
                if (i!=ans&&(!tag[i][ans]))
                    return -1;
            return ans;
        }
    }
};

 

  然后看了题解之后发现从图论入手就很简单——直接找入度为$n-1$,出度为$0$的点就行了,时间复杂度也是$O(n)$。

int in[1007],out[1007]; 

class Solution {
public:
    int findJudge(int n, vector<vector<int>>& trust) {
        int t=trust.size();
        memset(in,0,sizeof(in));
        memset(out,0,sizeof(out));
        for (int i=0;i<t;i++)
            out[trust[i][0]]++,in[trust[i][1]]++;
        int ans=0;
        for (int i=1;i<=n;i++)
            if (in[i]==n-1&&out[i]==0){
                if (ans)
                    return -1;
                else
                    ans=i;
            }
        return ans?ans:-1;
    }
};

 

leetcode 997. 找到小镇的法官

上一篇:Rose + Resin 在idea 可以跑起来的入门案例


下一篇:扩充序列