Skip to content

Commit c386fbe

Browse files
committed
find celebrity: done
1 parent cad9322 commit c386fbe

File tree

1 file changed

+105
-0
lines changed

1 file changed

+105
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,105 @@
1+
package com.leetcode.arrays;
2+
3+
import static org.junit.jupiter.api.Assertions.assertEquals;
4+
5+
/**
6+
* Level: Medium
7+
* Problem Link: https://leetcode.com/problems/find-the-celebrity/
8+
* Problem Description:
9+
* Suppose you are at a party with n people (labeled from 0 to n - 1) and among them, there may exist one celebrity.
10+
* The definition of a celebrity is that all the other n - 1 people know him/her but he/she does not know any of them.
11+
*
12+
* Now you want to find out who the celebrity is or verify that there is not one. The only thing you are allowed to do
13+
* is to ask questions like: "Hi, A. Do you know B?" to get information of whether A knows B. You need to find out the
14+
* celebrity (or verify there is not one) by asking as few questions as possible (in the asymptotic sense).
15+
*
16+
* You are given a helper function bool knows(a, b) which tells you whether A knows B. Implement a
17+
* function int findCelebrity(n). There will be exactly one celebrity if he/she is in the party. Return the celebrity's
18+
* label if there is a celebrity in the party. If there is no celebrity, return -1.
19+
*
20+
* Example 1:
21+
*
22+
* Input: graph = [
23+
* [1,1,0],
24+
* [0,1,0],
25+
* [1,1,1]
26+
* ]
27+
* Output: 1
28+
* Explanation: There are three persons labeled with 0, 1 and 2. graph[i][j] = 1 means person i knows person j, otherwise
29+
* graph[i][j] = 0 means person i does not know person j. The celebrity is the person labeled as 1 because both 0 and 2
30+
* know him but 1 does not know anybody.
31+
*
32+
*
33+
* Example 2:
34+
*
35+
* Input: graph = [
36+
* [1,0,1],
37+
* [1,1,0],
38+
* [0,1,1]
39+
* ]
40+
* Output: -1
41+
* Explanation: There is no celebrity.
42+
*
43+
*
44+
* Note: The directed graph is represented as an adjacency matrix, which is an n x n matrix where a[i][j] = 1 means
45+
* person i knows person j while a[i][j] = 0 means the contrary. Remember that you won't have direct access to the
46+
* adjacency matrix.
47+
*
48+
* @author rampatra
49+
* @since 2019-08-04
50+
*/
51+
public class FindTheCelebrity {
52+
53+
private int[][] knowsMatrix;
54+
55+
FindTheCelebrity(int[][] knowsMatrix) {
56+
this.knowsMatrix = knowsMatrix;
57+
}
58+
59+
public boolean knows(int a, int b) {
60+
return knowsMatrix[a][b] == 1;
61+
}
62+
63+
/**
64+
* Time Complexity: O(n)
65+
* Space Complexity: O(1)
66+
* Runtime: <a href="https://leetcode.com/submissions/detail/249123409/">6 ms</a>.
67+
*
68+
* @param n
69+
* @return
70+
*/
71+
public int findCelebrity(int n) {
72+
int celebrityIndex = 0;
73+
74+
for (int i = 1; i < n; i++) {
75+
// if a person doesn't know another person then he maybe a celebrity
76+
if (!knows(i, celebrityIndex)) {
77+
celebrityIndex = i;
78+
}
79+
}
80+
81+
for (int i = 0; i < n; i++) {
82+
// verify whether the celebrity only knows himself and all other people know the celebrity
83+
if ((knows(celebrityIndex, i) && i != celebrityIndex) || !knows(i, celebrityIndex)) {
84+
return -1;
85+
}
86+
}
87+
88+
return celebrityIndex;
89+
}
90+
91+
public static void main(String[] args) {
92+
FindTheCelebrity findTheCelebrity = new FindTheCelebrity(new int[][]{
93+
{1, 1, 0},
94+
{0, 1, 0},
95+
{1, 1, 1}});
96+
97+
assertEquals(1, findTheCelebrity.findCelebrity(3));
98+
99+
findTheCelebrity = new FindTheCelebrity(new int[][]{
100+
{1, 0},
101+
{0, 1}});
102+
103+
assertEquals(-1, findTheCelebrity.findCelebrity(2));
104+
}
105+
}

0 commit comments

Comments
 (0)