假設一場聚會有n個人,他們中間可能存在乙個名人。名人的定義是在場的人都認識他,而他卻不認識所有人。
已知條件:
1.函式knows(a,b)告訴你a是否認識b,返回bool值
你要做的事:確定這場聚會是否有名人的存在,如果不存在則return -1
答案:
public
class
solution
extends
relation
}//check that everyone else knows the candidate
for(int i = 0; i < n; i++)
}//return the celebrity
return candidate;
}}
演算法解析:因為名人不認識所有人,所有人認識名人,可以根據這個性質,來遍歷所有人.
int candidate = 0;
//find viable candidate
for(int i = 1; i < n; i++)
}
**解釋:假設3號是名人,總共5個人。因為所有人認識名人,所以knows(candidate, 3)肯定成立,潛在的名人candidate=3。而名人不認識所有人,所以knows(3,i)不可能再成立.由此可以確定名人是誰。
但是根據這個條件還不能完全確定這個人是不是名人。因為以上條件僅僅確定名人不認識剩下的所有人。
所以要再來一次遍歷
//check that everyone else knows the candidate
for(int i = 0; i < n; i++)
}
**解釋:如果當前的人不是名人且名人如果認識其中任何乙個人,或其他人不認識名人,則說明不存在名人.
本題解析:抓住題幹資訊,考慮問題全面即可解答
懶人讀演算法 二 細胞問題
細胞問題 每個細胞有兩種狀態 1為活細胞,0為死細胞,對於每個位置都滿足如下的條件 如果活細胞周圍八個位置的活細胞數少於兩個,則該位置活細胞死亡 如果活細胞周圍八個位置有兩個或三個活細胞,則該位置活細胞仍然存活 如果活細胞周圍八個位置有超過三個活細胞,則該位置活細胞死亡 如果死細胞周圍正好有三個活細...
懶人讀演算法(七) 旋轉矩陣
給乙個數字n,你要畫出從1到n平方的旋轉矩陣 如n 3,則你要畫出一下的乙個陣列 1,2,3 8,9,4 7,6,5 答案 public class solution 確定1,2,3 rowstart 行開始加1 for int i rowstart i rowend i 確定4,5 colend ...
懶人讀演算法 八 所有子集
給乙個唯一的陣列,返回所有該陣列的子集 例如 nums 1,2,3 返回 3 1 2 1,2,3 1,3 2,3 1,2 答案 public class solution private void recurse list result,int nums,stack path,int positio...