LeetCode 277 Find the Celebrity

思路

打擂台。每一次名人测试knows(ans,i)可以排除一个人的可能性:knows为真,则ans不是名人;否则i不是名人。首先将0放在擂台ans上,从1开始依次与擂台上的元素进行pk,如果knows为真则ans不是名人,将擂台上的元素换成i;否则i不是名人,擂台上依旧为原来的元素。最后经过n-1次比较,会剩下一个擂台上的元素,对其进行名人测试即可(!knows(ans,i)+knows(i,ans))。

复杂度

时间复杂度O(n), 空间复杂度O(1)

代码

/* The knows API is defined in the parent class Relation.
      boolean knows(int a, int b); */

public class Solution extends Relation {
    /**
     * @param n a party with n people
     * @return the celebrity's label or -1
     */
    public int findCelebrity(int n) {
        // Write your code here
        int ans = 0;
        for(int i = 1; i < n; i++) {
            if(knows(ans, i)) {
                ans = i;
            }
        }
        
        for(int i = 0; i < n; i++) {
            if(ans != i && knows(ans, i)) {
                return -1;
            }
            if(ans != i && !knows(i, ans)) {
                return -1;
            }
        }
        
        return ans;
    }
}

猜你喜欢

转载自blog.csdn.net/qq_36754149/article/details/88891490