劍指 62 圓圈中最後剩下的數字

2021-08-22 10:14:04 字數 1018 閱讀 8573

題目描述

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 輸出 ...