码迷,mamicode.com
首页 > 其他好文 > 详细

45、圆圈中最后剩下的数字

时间:2017-07-01 17:15:26      阅读:172      评论:0      收藏:0      [点我收藏+]

标签:imp   技术   sed   util   link   个数   空间   数组   get   

思路1:环形链表,每次只删除一个数,都从第0个开始。每次都从链表重复遍历,每删除一个,走m步,共n遍

时间O(nm),空间o(n)

 

技术分享
import java.util.*;
public class Solution {
    public int LastRemaining_Solution(int n, int m) {
        if(n < 1 || m < 1) {
            return -1;
        }
        List<Integer> list =  new LinkedList<>();
        for (int i = 0; i < n; i++) {
            list.add(i);
        }
        int idx = 0;
        while(list.size() > 1) {
            // 只要移动m-1次就可以移动到下一个要删除的元素上
            for (int i = 1; i < m; i++) {
                idx = (idx + 1) % list.size();//保证删除后,当数组数量小于m时,仍能正确的去删除
            }
            list.remove(idx);
        }
        
        return  list.get(0);
    }
    
}
View Code

 

 

思路2:时间O(n),空间o(1),

f(n,m) = f ‘(n - 1, m) {删除一个数后,再每次去删除第m个,最后剩下的数  ,一定等于, 上一次操作中,再每次去删除第m个,最后剩下的数}

即,不管处于第几次删除第m个数的循环里,最后剩下的数是一样的。

f(n,m) = {0,n=1(f(n,m)表示在n个数中,每次删除第m个后,最后剩下的一个数)

    [f(n -1,m) + m] % n, n > 1 

 

技术分享
public class Solution {
    public int LastRemaining_Solution(int n, int m) {
         if (n < 1 || m < 1) {
             return -1;
         }
        int last = 0;      
        for (int i = 2; i <= n; i++) {
            last = (last + m) % i;        
        } 
        return last;
    }
}
View Code

 

45、圆圈中最后剩下的数字

标签:imp   技术   sed   util   link   个数   空间   数组   get   

原文地址:http://www.cnblogs.com/lingli-meng/p/7102691.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!