题目描述
题目就是N个人,每第M号淘汰,输出最后选中的那位的序号.
思路
我们设置一个vector数组,每一个数组都是先预处理为下标 i 的数值,每一次第 M 号被淘汰,我们就选择将这个位的值置为-1,同时移动下标pos,自减一个提前设置好的初始值等于N的这样一个变量sum. 如果 当前位本来就是被访问过得,我们就移动到下一位.
代码(逻辑很简单)
class Solution {
public:
int lastRemaining(int n, int m) {
vector<int> vec(100001, 0);
for (int i = 0; i < n; ++i) {
vec[i] = i;
}
int pos = 0;
int count = 1;
int sum = n;
while (sum>1) {
if (vec[pos] == -1) {
pos = (pos + 1) % n;
}else{
if (count == m) {
--sum;
vec[pos] = -1;
count = 1;
pos = (pos + 1) % n;
}
else {
count++;
pos = (pos + 1) % n;
}
}
}
for (int i = 0; i < n; ++i) {
if (vec[i] >= 0) {
return vec[i];
}
}
return -1;
}
};
但是这个代码只有在N不是特别大的数字时才不会超时.
数学方法理解起来实在有难度,建议看K神题解,如果实在不行,就使用"