【题目描述】
0,1,···,n-1这n个数字排成一个圆圈,从数字0开始,每次从这个圆圈里删除第m个数字(删除后从下一个数字开始计数)。求出这个圆圈里剩下的最后一个数字。
例如,0、1、2、3、4这5个数字组成一个圆圈,从数字0开始每次删除第3个数字,则删除的前4个数字依次是2、0、4、1,因此最后剩下的数字是3。
【示例】
输入: n = 5, m = 3
输出: 3
输入: n = 10, m = 17
输出: 2
【实现思路】
【第一轮后面的数字应该是[0, 1, 2 ,3 ,4],手误打错了。。抱歉】
从图里面看,每次删除一个元素后重新开始数数,都相当于把后面的数字重新开始计数
最后剩下的 3 的下标是 0。
- 第四轮反推,补上 mm 个位置,然后模上当时的数组大小 22,位置是(0 + 3) % 2 = 1。
- 第三轮反推,补上 mm 个位置,然后模上当时的数组大小 33,位置是(1 + 3) % 3 = 1。
- 第二轮反推,补上 mm 个位置,然后模上当时的数组大小 44,位置是(1 + 3) % 4 = 0。
- 第一轮反推,补上 mm 个位置,然后模上当时的数组大小 55,位置是(0 + 3) % 5 = 3。
所以最终剩下的数字的下标就是3。因为数组是从0开始的,所以最终的答案就是3。
总结一下反推的过程,就是 (当前index + m) % 上一轮剩余数字的个数。
【代码实现】
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;
}
};
引用: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/