LeetcodeDaily | 1579. 圓圈中最後剩下的數字

題目

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

思路

本來一開始,就覺得又規律可循,就一直在用數組推導,但是這樣會超時。看了題解才發現這是個遞歸問題,講的是“約瑟夫環”。
可以用倒推的方式來理解,其中因爲是從0-n的所以返回數字就相當於是返回位置。

人數 返回位置
1 0
2 (0+m)%2
3 ((0+m)%2)+m)%3
4 (((0+m)%2)+m)%3 )+m)%4

約瑟夫環的公式是:
在這裏插入圖片描述

所以可以用遞歸:

class Solution {
    int f(int n, int m) {
        if (n == 1)
            return 0;
        int x = f(n - 1, m);
        return (m + x) % n;
    }
public:
    int lastRemaining(int n, int m) {
        return f(n, m);
    }
};

也可以直接用循環

class Solution {
public:
    int lastRemaining(int n, int m) {
        int f = 0;
        for (int i = 2; i != n + 1; ++i)
            f = (m + f) % i;
        return f;
    }
};

參考:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章