剑指 Offer 62. 圆圈中最后剩下的数字

题目:

0,1,···,n-1这n个数字排成一个圆圈,从数字0开始,每次从这个圆圈里删除第m个数字(删除后从下一个数字开始计数)。求出这个圆圈里剩下的最后一个数字。

例如,0、1、2、3、4这5个数字组成一个圆圈,从数字0开始每次删除第3个数字,则删除的前4个数字依次是2、0、4、1,因此最后剩下的数字是3。

 

示例 1:

输入: n = 5, m = 3
输出: 3

示例 2:

输入: n = 10, m = 17
输出: 2

 

限制:

  • 1 <= n <= 10^5
  • 1 <= m <= 10^6

 

代码:

//超时了

 1 import java.util.*;
 2 
 3 /**
 4  * @author zcy
 5  * @date 2021年04月11日 16:28
 6  */
 7 
 8 class Solution {
 9     public int lastRemaining(int n, int m) {
10 
11         List<Integer> list = new LinkedList<>();
12         for (int i = 0; i < n; i++) {
13             list.add(i );
14         }
15         //上一次删除时,删除下标前一位的下标
16         int index = -1;
17         while (n > 1) {
18             int t = index + m;
19             //取模,因为可能超过长度
20             t = t % n;              
21             list.remove(t);
22                         //在头尾的话index都会到最后一个位置
23             if(t==0||t==n-1){            
24                 index=n-2;
25             }else{
26                 index=t-1;
27             }
28             n--;
29         }        
30         return list.get(0);
31     }
32 }        

 

代码2:

//约瑟夫环问题

 1 import java.util.*;
 2 
 3 /**
 4  * @author zcy
 5  * @date 2021年04月11日 16:28
 6  */
 7 
 8 class Solution {
 9     public int lastRemaining(int n, int m) {
10         int p=0;
11         for(int i=2;i<=n;i++){
12             p=(p+m)%i;
13         }
14         return p;
15 
16     }
17 }

 

posted @ 2021-04-13 15:53  堤苏白  阅读(81)  评论(0)    收藏  举报