js + leetcode刷題:面試題62. 圓圈中最後剩下的數字

思路:這類數據很多的處理,一定要先去尋找前後相互之間的關係,並確定邊界情況,這樣就會好處理很多。
比如本題,可推導出公式:f(n) = (m+f(n-1))% m;當n變爲1即長度爲1時結束,f(n)代表n時最終刪除的那個數值

題目:

面試題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
輸出: 3
示例 2:
輸入: n = 10, m = 17
輸出: 2
限制:
1 <= n <= 10^5
1 <= m <= 10^6

思路:

// 迭代  72ms  34.6mb
/**
 * @param {number} n
 * @param {number} m
 * @return {number}
 */
var lastRemaining = function(n, m) {
    let r = 0;
    for(let i = 2; i <= n; i++) {
        r = (m + r) % i;
    }
    return r
};

// 遞歸  可寫成遞歸,但是爆棧,不能通過
var lastRemaining = function (n, m) {
    return recur(n, m)
};

function recur (n, m) {
    if (n === 1) return 0
    let r = recur(n - 1, m)
    return (m + r) % n
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章