zoukankan      html  css  js  c++  java
  • (图论基础题) leetcode 997. Find the Town Judge

    In a town, there are N people labelled from 1 to N.  There is a rumor that one of these people is secretly the town judge.

    If the town judge exists, then:

    1. The town judge trusts nobody.
    2. Everybody (except for the town judge) trusts the town judge.
    3. There is exactly one person that satisfies properties 1 and 2.

    You are given trust, an array of pairs trust[i] = [a, b] representing that the person labelled a trusts the person labelled b.

    If the town judge exists and can be identified, return the label of the town judge.  Otherwise, return -1.

    Example 1:

    Input: N = 2, trust = [[1,2]]
    Output: 2
    

    Example 2:

    Input: N = 3, trust = [[1,3],[2,3]]
    Output: 3
    

    Example 3:

    Input: N = 3, trust = [[1,3],[2,3],[3,1]]
    Output: -1
    

    Example 4:

    Input: N = 3, trust = [[1,2],[2,3]]
    Output: -1
    

    Example 5:

    Input: N = 4, trust = [[1,3],[1,4],[2,3],[2,4],[4,3]]
    Output: 3

    Note:

    1. 1 <= N <= 1000
    2. trust.length <= 10000
    3. trust[i] are all different
    4. trust[i][0] != trust[i][1]
    5. 1 <= trust[i][0], trust[i][1] <= N

    ==================================================================

    PS:记得几个月前在leetcode周赛上做这个题时,当时没有好好学图论,觉得这个题怎么这么难,还是但是标签是easy。。。最后用了一个很麻烦的方法写了。现在,学了图论后,发现这个题是真的很easy。。。看来,我还需要更加努力了

    这个题是图论题,就是找入度为N-1和出度为0的点,trust他人就是出度,被trust就是入度。所以,最后这个题可以化为入度和出度差值为N-1的人。没找到就返回-1。

    C++代码:

    class Solution {
    public:
        int findJudge(int N, vector<vector<int>>& trust) {
            vector<int> vec(N+1,0);
            for(auto t : trust){
                vec[t[0]]--;
                vec[t[1]]++;
            }
            for(int i = 1; i <= N; i++){
                if(vec[i] == N-1)
                    return i;
            }
            return -1;
        }
    };

    另外附上几个月前写的代码:

    class Solution {
    public:
        int findJudge(int N, vector<vector<int>>& trust) {
            set<int> s1,s2;
            if(trust.size() == 0)
                return 1;
            int num;
            vector<vector<int> > ans;
            for(int i = 0; i < trust.size(); i++){
                s1.insert(trust[i][0]);
                s2.insert(trust[i][1]);
            }
            for(set<int>::iterator it = s2.begin(); it!=s2.end(); it++){
                if(s1.count(*it))
                    s2.erase(*it);
            }
            if(s2.size() != 1)
                return -1;
            else{
                for(set<int>::iterator it = s2.begin(); it!=s2.end(); it++){
                    num = *it;
                }
                for(int i = 0;i < trust.size(); i++){
                    if(trust[i][1] == num){
                        ans.push_back(trust[i]);
                    }
                }
                if(ans.size() == N - 1)
                    return ans[0][1];
                else
                    return -1;
            }
        }
    };
  • 相关阅读:
    linux系统中ssh部署两台服务器远程免密登录
    R语言绘图常用的颜色组合
    R语言中将矩阵转化为行列的形式
    python中返回列表中元素的索引
    R语言如何读取excel数据
    linux系统中实现网络会话共享功能
    python中求1到100的和(循环变量的和)
    linux系统中创建网络会话
    Java程序的三十个基本规则
    风雨20年:我所积累的20条编程经验
  • 原文地址:https://www.cnblogs.com/Weixu-Liu/p/10883214.html
Copyright © 2011-2022 走看看