标签:java htm lan 部分 lis param 时间复杂度 解决 打印
方便求解最后的胜利者同时也适合打印 出列 序列的,时间复杂度O(N).
下面方法借鉴自Java程序练习-约瑟夫环问题
public static int josepusONWithList(int n, int m) {
return josepusONWithList(n, m, 1);
}
public static int josepusONWithList(int n, int m, int k) {
if (n <= 0 || m <= 0 || k <= 0)
return -1;
LinkedList<Integer> list = new LinkedList<Integer>();
for (int i = 1; i <= n; i++)
list.add(i);
int outPos;
while (list.size() > 1) {
outPos = (int) (k + m - 2) % list.size();
// System.out.print(list.get(outPos)+" , ");
list.remove(outPos);
k = outPos + 1;
}
// System.out.println(list.get(0));
return list.get(0);
}
在有时候需要知道出列的序列,上述System.out部分就是出列序列
public static int josephusON(int n, int m) {
return josephusON(n, m, 1);
}
/**
* Josephus 环的一个O(N)算法
*
* @param n 总人数
* @param m 数到m的人出列
* @param k 开始报数人的编号
* @return 最后一个出列的编号
*/
public static int josephusON(int n, int m, int k) {
int p = 0;
for (int i = 2; i <= n; i++) {
// System.out.print((p + k == n ? n : (p + k) % n)+" ");
p = (p + m) % i;
}
return (p + k) % n; // 返回最后一人的编号
}
标签:java htm lan 部分 lis param 时间复杂度 解决 打印
原文地址:http://www.cnblogs.com/apanda009/p/7855996.html