剑指 Offer 62. 圆圈中最后剩下的数字

题目链接:剑指 Offer 62. 圆圈中最后剩下的数字

方法:约瑟夫环 + 倒推

解题思路

  • 假设我们最好剩余的数字是 \(N\)
  • 执行完 "删除第三个元素" 的操作后,\(N\) 在新数组中的位置 \(P\) 的意义是什么?它表示,在新数组中,\(N\) 前面有还有 \(P\) 个元素。那么,在当前数组中,\(N\) 前面一定有 \(P+3\) 个元素。 明白了这一点即可开始倒推。
  • 最后一轮:当前有 \(1\) 个元素。\(N\) 的位置是 \(0\)
  • 倒数第 \(2\) 轮:当前有 \(2\) 个元素。已知在执行完 "删除第三个元素" 后,\(N\) 在新数组中的位置是 \(0\)。则说明在本轮中 \(N\) 前面有 \(0+3=3\) 个元素,所以 \(N\) 的位置是 \(3\),然而本轮只有 \(2\) 个元素,所以 \(N\) 的实际位置是 \((0+3)%2=1\)
  • 倒数第 \(3\) 轮:当前有 \(3\) 个元素。已知在执行完 "删除第三个元素" 后,\(N\) 在新数组中的位置是 \(1\)。说明此刻,\(N\) 前面有 \(1+3=4\) 个元素,所以 \(N\) 的位置是 \(4\)。而当前数组只有 \(3\) 个元素,故实际位置是 \((1+3)%3=1\)
  • ...

代码

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

复杂度分析

时间复杂度:\(O(n)\);
空间复杂度:\(O(1)\)

posted @ 2023-04-13 22:21  lixycc  阅读(27)  评论(0)    收藏  举报