題目描述
0, 1, …, n-1這n個數字排成乙個圓圈,從數字0開始每次從這個圓圈裡刪除第m個數字。求出這個圓圈裡剩下的最後乙個數字。演算法分析
方法一:使用鍊錶來模擬圓圈,時間複雜度為o(mn),空間複雜度o(n)。提交**:方法二:約瑟夫環問題的數學公式法求解,公式推導見約瑟夫環問題 ( 最簡單的數學解法),得到公式f(n, m)= [f(n-1, m) + m] % n,其中,m表示每次數到該數的人出列,n表示當前序列的總人數。
class solution
auto next = ++curr;
if(next == data.end())
next = data.begin();
--curr;
data.erase(curr);
curr = next;
} return *curr;
} /* 方法二:數學公式推導 */
int lastremaining_solution2(int n, int m)
};
測試**:
// ********************測試**********************
void test(const char* testname, unsigned int n, unsigned int m, int expected)
void test1()
void test2()
void test3()
void test4()
void test5()
void test6()
int main(int argc, char* argv)
劍指62 圓圈中最後剩下的數字
題目 0 n 1的n個數排成乙個圓圈,從0開始每次從這個圓圈刪除第m個數字,然後從刪除的數字的下乙個數字開始繼續直到剩最後1個數字位置。方法1 用list模擬圓圈 的環形鍊錶 每次迴圈到end 時都手動更新到begin 效率不高 stl list使用 class solution cur circl...
劍指 Offer 62 圓圈中最後剩下的數字
題目 題目描述 0,1,n 1這n個數字排成乙個圓圈,從數字0開始,每次從這個圓圈裡刪除第m個數字。求出這個圓圈裡剩下的最後乙個數字。例如,0 1 2 3 4這5個數字組成乙個圓圈,從數字0開始每次刪除第3個數字,則刪除的前4個數字依次是2 0 4 1,因此最後剩下的數字是3。示例 1 輸入 n 5...
劍指 Offer 62 圓圈中最後剩下的數字
0,1,n 1這n個數字排成乙個圓圈,從數字0開始,每次從這個圓圈裡刪除第m個數字。求出這個圓圈裡剩下的最後乙個數字。例如,0 1 2 3 4這5個數字組成乙個圓圈,從數字0開始每次刪除第3個數字,則刪除的前4個數字依次是2 0 4 1,因此最後剩下的數字是3。示例 1 輸入 n 5,m 3 輸出 ...