【LeetCode刷题(简单程度)】剑指 Offer 62. 圆圈中最后剩下的数字(约瑟夫问题)

it2025-03-02  23

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

来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/yuan-quan-zhong-zui-hou-sheng-xia-de-shu-zi-lcof 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

思路一:暴力法(要注意删除元素迭代器失效)(实测超时的)

class Solution { public: int lastRemaining(int n, int m) { list<int> temp; int _size = n; for(int i = 0;i < n;++i) { temp.push_back(i); } auto it = temp.begin(); while(_size > 1) { int m_temp = m; while(--m_temp > 0) { ++it; if(it == temp.end()) it = temp.begin(); } auto next = ++it;//保存下一个位置 if(next == temp.end()) next = temp.begin(); --it;//恢复 temp.erase(it); it = next;//恢复迭代器 --_size; } return *temp.begin(); } };

思路二:数学推导看这位大哥的吧:约瑟夫环——公式法(递推公式)

代码实现:

class Solution { public: int lastRemaining(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; } };
最新回复(0)