题目地址:https://leetcode.com/problems/rotting-oranges/

题目描述

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

Ifthe town judge exists, then:

1、 Thetownjudgetrustsnobody.;
2、 Everybody(exceptforthetownjudge)truststhetownjudge.;
3、 Thereisexactlyonepersonthatsatisfiesproperties1and2.;

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

Ifthe 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]arealldifferent;
4、 trust[i][0]!=trust[iopeninnewwindow][];
5、 1<=trust[i][0],trust[iopeninnewwindow][]<=N;

题目大意

镇里有编号1~N的N个人,如果有个法官存在的话,需要满足三个条件:

1、 法官谁也不信任;
2、 每个人都信任这个人;
3、 只有一个人满足条件1和2;

给出的trust[i] = [a, b]代表了a信任b。

如果法官存在,返回他的序号,否则返回-1.

解题方法

其实这个就是有向图,[a, b]表示从顶点a出发指向顶点b的一条有向边。

所以,题目的意思就是:是否存在且只存在一个顶点,所有的顶点都指向他,但是这个点不指向任何点。用术语来说就是该顶点的入度是N - 1,出度是0.

我们可以使用一个数组存储每个点的入度和出度的差,当某个点的入度和出度的差是N - 1时,代表他是法官,否则不存在。

证明:如果入度和出度的差 = N - 1,又入度、出度 >= 0,那么入度 = N- 1,出度 = 0,满足条件1和2.一旦存在一个点满足条件,那么说明这个点没有出度,所以不存在另一个点的入度是N - 1,满足条件3.

C++代码如下:

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

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

2022

DDKK.COM 弟弟快看-教程,程序员编程资料站,版权归原作者所有

本文经作者:负雪明烛 授权发布,任何组织或个人未经作者授权不得转发