约瑟夫环问题:
用数组模拟约瑟夫环:(力扣超时,牛客可以通过,主要力扣输入的n和m都太大了)
主要有一个数组和三个变量
数组 visit 表示是否被访问过
cur 表示当前真实走过的位置
step 表示值拜访过的步数
record 表示当前拜访了多少个
class Solution {
public:
int lastRemaining(int n, int m) {
vector<bool> visit(n, false);
int cur = 0, step = 0, record = 0;
while (record < n - 1) {
if (!visit[cur % n]) {
++step;
if (step % m == 0) {
visit[cur % n] = true;
++record;
}
}
++cur;
}
for (int i = 0; i < n; ++i) {
if (!visit[i]) return i;
}
return -1;
}
};
数学法:(具体过程点击上方“力扣地址”链接去力扣题解查看)
class Solution {
public:
int lastRemaining(int n, int m) {
int res = 0;
for (int i = 2; i <= n; ++i) {
res = (res + m) % i;
}
return res;
}
};