Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

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
Lines changed: 105 additions & 0 deletions
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)

AltStyle によって変換されたページ (->オリジナル) /