題記 數學 約瑟夫環 LeetCode

2021-10-05 04:58:37 字數 809 閱讀 7186

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

3示例 2:

輸入: n =

10, m =

17輸出:

2

限制:

1 <= n <= 10^5

1 <= m <= 10^6

很容易想到鍊錶法,但是會超時

class

solution

else

}return l.

back()

;}};

數學解法:

最終剩下乙個人時的安全位置肯定為0,反推安全位置在人數為n時的編號

人數為1: 0

人數為2: (0+m) % 2

人數為3: ((0+m) % 2 + m) % 3

人數為4: (((0+m) % 2 + m) % 3 + m) % 4

class

solution

return p;}}

;

約瑟夫環數學解法

無論是用鍊錶實現還是用陣列實現都有乙個共同點 要模擬整個遊戲過程,不僅程式寫起來比較煩,而且時間複雜度高達o nm 當n,m非常大 例如上百萬,上千萬 的時候,幾乎是沒有辦法在短時間內出結果的。我們注意到原問題僅僅是要求出最後的勝利者的序號,而不是要讀者模擬整個過程。因此如果要追求效率,就要打破常規...

約瑟夫環 數學解法

約瑟夫環是乙個數學的應用問題 已知n個人 以編號1,2,3 n分別表示 圍坐在一張圓桌周圍 從編號為k的人開始報數,數到m的那個人出列 他的下乙個人又從1開始報數,數到m的那個人又出列 依此規律重複下去,直到圓桌周圍的人全部出列。f 1 0 f i f i 1 m i i 1 includeusin...

約瑟夫環 數學策略

無論是用鍊錶實現還是用陣列實現都有乙個共同點 要模擬整個遊戲過程,不僅程式寫起來比較煩,而且時間複雜度高達o nm 當n,m非常大 例如上百萬,上千萬 的時候,幾乎是沒有辦法在短時間內出結果的。我們注意到原問題僅僅是要求出最後的勝利者的序號,而不是要讀者模擬整個過程。因此如果要追求效率,就要打破常規...