[Lc]面试题62圆圈中最后剩下的数字
Contents
题目
这道题是约瑟夫环可以用链表暴力删除,但是复杂度较高,是$O(mn)$
1. 数学递推公式法
题解中大部分都是对这个递推公式的讲解,我的个人理解如下
- 首先最后一次该数的pos肯定为0
- 递推前一次,由于每次是在当前位置往后推m个数,那么上一次的pos为m+pos
- 但是数组的长度是有限的,那么m+pos可能超过了当前数组的长度
那么需要对这个数组进行取余,其中i就是当前数组的长度,从i开始一直到n,最后就得出如下的递推公式
核心就是一个数学递推公式:
- 时间复杂度$O(n)$
- 空间复杂度$O(1)$
class Solution {//约瑟夫环,数学递推公式法
public:
int lastRemaining(int n, int m) {
int pos = 0;//最后一个数的位置
//从数组长度为2开始,一直到n
for(int i = 2; i <= n; ++i){
//递推公式
pos = (pos + m) % i;
}
return pos;
}
};
Author ChrisHRZ
LastMod 2020-06-27