约瑟夫问题:N个人围成一圈,从第一个开始报数,第M个将被杀掉,最后剩下一个,其余人都将被杀掉。例如N=6,M=5,被杀掉的顺序是:6,4,5,2,1,3。 //队列 private int jp(int n, int m) { Queue<Integer> queue = new LinkedList<>(); for (int i = 0; i <= n ; i++) { queue.add(i); } int lastValue = n; while (!queue.isEmpty()){ int k = m % queue.size(); if(k == 0) { k = queue.size(); } for (int i = 1; i < k; i++) { Integer value = queue.poll(); queue.add(value); } lastValue = queue.poll(); } return lastValue; } //迭代 public int lastRemaining2(int n, int m) { int flag = 0; for (int i = 2; i <= n; i++) { flag = (flag + m) % i; //动态规划的思想,将f(n,m)替换成flag存储 } return flag; } //递归 public int lastRemaining(int n, int m){ if(n < 1 || m < 1) { return -1; } if(n == 1) { return 0; } return (lastRemaining(n-1, m) + m) % n; } //list public int lastRemaining3(int n, int m) { if(n==0||m==0) { return -1; } List<Integer> list=new ArrayList<>(); for(int i=0;i<n;i++) { list.add(i); } int c=(m-1)%n; while(list.size()!=1) { list.remove(c); c=(c+m-1)%list.size(); } return list.get(0); }
算法-约瑟夫问题
最新推荐文章于 2024-04-24 15:47:54 发布