java名人_识别名人 · Find the Celebrity
[抄題]:
假設你和?n?個人在一個聚會中(標記為?0?到?n - 1),其中可能存在一個名人。名人的定義是所有其他?n - 1?人都認識他/她,但他/她不知道任何一個。
現在你想要找出這個名人是誰或者驗證這個名人不存在。你唯一可以做的事情就是提出如下問題:“你好,A,你認識B嗎?” 來獲取A是否認識B。您需要通過詢問盡可能少的問題(以漸近的意義)來找出名人是誰(或驗證其不存在)。
你得到一個輔助函數?bool know(a,b),它會告訴你A是否知道B.實現一個函數?int findCelebrity(n),你的函數應該使?knows?的調用次數最少。
[暴力解法]:
n個人問n-1遍
時間分析:true的時候可以排除一個人,false的時候可以排除一個人。從而降低復雜度到n-1 + 1 = n
空間分析:
[思維問題]:
不知兩兩比較的時候是不是要用i i+1,感覺換起來很麻煩:定義一個ans,掃一遍i的過程中改變唯一的結果ans即可
[一句話思路]:
[輸入量]:空:?正常情況:特大:特小:程序里處理到的特殊情況:異常情況(不合法不合理的輸入):
[畫圖]:
[一刷]:
不知道為啥最后還要檢驗是不是名人:防止兩人互相認識的特殊情況(要考慮到)
[二刷]:
最后檢查的時候,先假設i不是ans,才能二者之間對比檢驗。i == ans時不要想著引入第三個變量來檢驗。
[三刷]:
[四刷]:
[五刷]:
[五分鐘肉眼debug的結果]:
[總結]:
[復雜度]:Time complexity: O(n) Space complexity: O(1)
[英文數據結構或算法,為什么不用別的數據結構或算法]:
api函數就當一般函數,拿來就用就行
[其他解法]:
[Follow Up]:
[LC給出的題目變變變]:
[代碼風格] :
/*The knows API is defined in the parent class Relation.
boolean knows(int a, int b);*/
public class Solution extendsRelation {/***@paramn a party with n people
*@returnthe celebrity's label or -1*/
public int findCelebrity(intn) {//find
int ans = 0;for (int i = 1; i < n; i++) {if (knows(ans, i) == true) {
ans=i;
}
}//check
for (int i = 0; i < n; i++) {//suppose not
if (i != ans && !knows(i, ans)) {return -1;
}if (i != ans &&knows(ans, i)) {return -1;
}
}return ans;//}
}
View Code
新人創作打卡挑戰賽發博客就能抽獎!定制產品紅包拿不停!總結
以上是生活随笔為你收集整理的java名人_识别名人 · Find the Celebrity的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: asp网站短信api服务器,asp短信接
- 下一篇: Python学习笔记:Day 9 编写A