天天看點

【劍指offer:圓圈中最後剩下的數字】JavaScript實作

題目描述:0,1,,n-1 這 n 個數字排成一個圓圈,從數字 0 開始,每次從這個圓圈裡删除第 m 個數字。求出這個圓圈裡剩下的最後一個數字。例如,0、1、2、3、4 這 5 個數字組成一個圓圈,從數字 0 開始每次删除第 3 個數字,則删除的前 4 個數字依次是 2、0、4、1,是以最後剩下的數字是 3。

示例:

輸入: n = 5, m = 3
輸出: 3           

複制

解法 1: 數學規律

可以發現:

  • n=1,最後剩下的數字是 0
  • n=2,最後剩下的數字是 (0 + m)%2
  • n=3,最後剩下的數字是 ((0 + m)%2 + m)%3

可以将上面的規律寫成循環,第 n 次的結果等于:(上次一次結果 + m)%n

代碼實作如下:

// ac位址:https://leetcode-cn.com/problems/yuan-quan-zhong-zui-hou-sheng-xia-de-shu-zi-lcof/
// 原文位址:https://xxoo521.com/2020-04-19-last-remain-number/
/**
 * @param {number} n
 * @param {number} m
 * @return {number}
 */
var lastRemaining = function(n, m) {
    let result = 0;
    for (let i = 2; i <= n; ++i) {
        result = (result + m) % i;
    }
    return result;
};           

複制

時間複雜度是O(N),空間複雜度是O(1)。

解法 2:模拟循環連結清單

嘗試了下這種做法,會 TLE。因為時間複雜度是 O(m*n)。

本文參與 騰訊雲自媒體分享計劃 ,歡迎熱愛寫作的你一起參與!

本文分享自作者個人站點/部落格

https://xxoo521.com/

複制

如有侵權,請聯系 [email protected] 删除。