美文网首页剑指 Offer Java版
剑指Offer Java版 面试题62:圆圈中最后剩下的数字

剑指Offer Java版 面试题62:圆圈中最后剩下的数字

作者: 孙强Jimmy | 来源:发表于2019-08-10 11:46 被阅读4次

    题目:0,1,···,n-1这n个数字排成一个圆圈,从数字0开始,每次从这个圆圈里删除第m个数字。求出这个圆圈里剩下的最后一个数字。

    练习地址

    https://www.nowcoder.com/practice/f78a359491e64a50bce2d89cff857eb6

    经典的解法,用环形链表模拟圆圈

    import java.util.LinkedList;
    
    public class Solution {
        public int LastRemaining_Solution(int n, int m) {
            if (n < 1 || m < 1) {
                return -1;
            }
            LinkedList<Integer> numbers = new LinkedList<>();
            for (int i = 0; i < n; i++) {
                numbers.add(i);
            }
            int current = 0;
            while (numbers.size() > 1) {
                current = (current + m - 1) % numbers.size();
                numbers.remove(current);
            }
            return numbers.getFirst();
        }
    }
    

    复杂度分析

    • 时间复杂度:O(n)。
    • 空间复杂度:O(n)。

    创新的解法,拿到Offer不在话下

    public class Solution {
        public int LastRemaining_Solution(int n, int m) {
            if (n < 1 || m < 1) {
                return -1;
            }
            int last = 0;
            for (int i = 2; i <= n; i++) {
                last = (last + m) % i;
            }
            return last;
        }
    }
    

    递推公式:f(n,m) = [f(n-1,m)+m]%n,n>1。

    公式推理过程可以见书P302。

    复杂度分析

    • 时间复杂度:O(n)。
    • 空间复杂度:O(1)。

    👉剑指Offer Java版目录
    👉剑指Offer Java版专题

    相关文章

      网友评论

        本文标题:剑指Offer Java版 面试题62:圆圈中最后剩下的数字

        本文链接:https://www.haomeiwen.com/subject/uvzljctx.html