leetcode--面试题62. 圆圈中最后剩下的数字

面试题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

思路一:模拟算法

class Solution {
public:
    int lastRemaining(int n, int m) {
        vector<int> ans(n, 0);
        for (int i=0; i<n; i++) {
            ans[i] = i;
        }
        auto it=ans.begin();
        int idx = 0;
        while (n > 1) {
            idx = (idx + m - 1) % n;
            it = ans.begin() + idx;
            ans.erase(it);
            n--;
        }
        return ans[0];
    }
};
/*超时*/

时间复杂度:O(N^2)
空间复杂度:O(N)

思路二:数学解法——迭代

class Solution {
public:
    int lastRemaining(int n, int m) {
        int ans = 0;
        for (int i=2; i<=n; i++) {
            ans = (ans + m) % i;
        }
        return ans;
    }
};
/*8ms,5.7MB*/

时间复杂度:O(N)
空间复杂度:O(N)

思路三:数学解法——递归

class Solution {
public:
    int lastRemaining(int n, int m) {
        return f(n, m);
    }
    int f(int n, int m) {
        if (1 == n) return 0;
        return (m + f(n-1, m)) % n;
    }
};
/*12ms,8.8MB*/

时间复杂度:O(N)
空间复杂度:O(1)

参考链接:https://leetcode-cn.com/problems/yuan-quan-zhong-zui-hou-sheng-xia-de-shu-zi-lcof/solution/javajie-jue-yue-se-fu-huan-wen-ti-gao-su-ni-wei-sh/

https://leetcode-cn.com/problems/yuan-quan-zhong-zui-hou-sheng-xia-de-shu-zi-lcof/solution/chi-jing-stsu-degd-degtsu-tu-jie-yue-se-fu-huan-hu/

发布了59 篇原创文章 · 获赞 0 · 访问量 1174

猜你喜欢

转载自blog.csdn.net/u011861832/article/details/105194447