因为对STL中的 list 容器和 iterator 迭代器的使用不熟悉,花了很多时间现补知识。
最开始的代码会报段错误,如果把 iter++ 放在erase里面就不会报段错误,但还是会返回错误的结果。
int LastRemaining_Solution(int n, int m)
{
if(n<=0 || m<=0) return -1;
list<int> circlelist;
list<int>::iterator iter;
for(int i=0; i<n; i++){
circlelist.push_back(i);
}
iter = circlelist.begin();
int count = -1;
while(circlelist.size()>1){
for(; iter != circlelist.end(); iter++){ // 迭代器不能用小于,只能用 !=
count++;
if(count == m-1) {
circlelist.erase(iter); //用erase不能用remove的原因?两者区别?
iter++;
count = 0;
}
}
iter = circlelist.begin();
}