剑指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 }

 

posted @ 2019-09-18 11:39  chyblogs  阅读(123)  评论(0)    收藏  举报