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)