标签: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