n
個人按順序圍成一圈(編號為1
~n
),從第1
個人從1
開始報數,報到k
的人出列,相鄰的下個人重新從1
開始報數,報到k
的人出列,重復這個過程,直到隊伍中只有1
個人為止,這就是約瑟夫問題。現在給定n
和k
,你需要返回最后
剩下的那個人的編號。
- 1<=n<=1000, 1<=k<=100
在線評測地址:LintCode 領扣
樣例1
輸入: n = 5, k = 3
輸出: 4
解釋:
求解過程:
原隊列 :1 2 3 4 5
第一輪: 1 2 4 5 其中 3 出列
第二輪: 2 4 5 其中 1 出列
第三輪: 2 4 其中 5 出列
第四輪: 4 其中 2 出列
樣例2
輸入: n = 5, m = 1
輸出: 5
解釋:
第一輪: 2 3 4 5, 其中 1 出列
第二輪: 3 4 5, 其中 2 出列
第三輪: 4 5, 其中 3 出列
第四輪: 5, 其中 4 出列
【題解】
暴力解決。建立一個鏈表,並在每次迭代中刪除一個節點。O(n)時間復雜度。
public class Solution { /** * @param n: an integer * @param k: an integer * @return: the last person's number */ public int josephProblem(int n, int k) { List<Integer> list = new LinkedList<>(); for (int i = 1; i <= n; i++) { list.add(i); } int i = 0; while (list.size() != 1) { i = (i + k - 1) % list.size(); list.remove(i); } return list.get(0); } }
更多題解參見:九章算法