剑指offer_圆圈中最后剩下的数
题目描述
让小朋友们围成一个大圈。然后,随机指定一个数 m,让编号为 0 的小朋友开始报数。每次喊到 m-1 的那个小朋友 要出列唱首歌,然后可以在礼品箱中任意的挑选礼物,并且不再回到圈中,从他的下一个小朋友开始,继续 0...m-1 报数 .... 这样下去 .... 直到剩下最后一个小朋友,可以不用表演。
方法一:模拟过程
1 import java.util.LinkedList; 2 3 public class Solution { 4 public int LastRemaining_Solution(int n, int m) { 5 LinkedList<Integer> list = new LinkedList<Integer>(); 6 for (int i = 0; i < n; i ++) { 7 list.add(i); 8 } 9 10 int bt = 0; 11 while (list.size() > 1) { 12 bt = (bt + m - 1) % list.size(); 13 list.remove(bt); 14 } 15 16 return list.size() == 1 ? list.get(0) : -1; 17 } 18 }
方法二:
递归数学
约瑟夫环,圆圈长度为 n 的解可以看成长度为 n-1 的解再加上报数的长度 m。因为是圆圈,所以最后需要对 n 取 余。
1 public int LastRemaining_Solution(int n, int m) { 2 if (n == 0) /* 特殊输入的处理 */ 3 return -1; 4 if (n == 1) /* 递归返回条件 */ 5 return 0; 6 return (LastRemaining_Solution(n - 1, m) + m) % n; 7 }

浙公网安备 33010602011771号