|
| 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