leetcode-面试题62-圆圈中剩下的最后数字

题目描述:

 

 方法一:第一次提交:python暴力 O(N^2)

class Solution:
    def lastRemaining(self, n: int, m: int) -> int:
        a = [i for i in range(n)]
        i = 0
        while(len(a) > 1):
            i = (i + m-1)%len(a)
            a.pop(i)
        return a[0]

Java版:

class Solution {
    public int lastRemaining(int n, int m) {
        ArrayList<Integer> arr = new ArrayList<>(n);
        for(int i = 0;i<n;i++){
            arr.add(i);
        }
        int idx = 0;
        while(n>1){
            idx = (idx+m-1) % n;
            arr.remove(idx);
            n--;
        }
        return arr.get(0);
    }
}

方法二:数学方法 O(N) Java版

class Solution {
    public int lastRemaining(int n, int m) {
        int ans = 0;
        for(int i = 2; i <= n;i++){
            ans = (ans + m) % i;

        }
        return ans;
    }
}

python 方法二递归写法

sys.setrecursionlimit(100000) #修改python默认递归深度
def f(n, m):
    if n == 0:
        return 0
    x = f(n - 1, m)
    return (m + x) % n

class Solution:
    def lastRemaining(self, n: int, m: int) -> int:
        return f(n, m)

 

posted @ 2020-03-31 10:33  oldby  阅读(124)  评论(0编辑  收藏  举报