剑指 Offer-62-圆圈中最后剩下的数字
2020-11-01 本文已影响0人
阿凯被注册了
0,1,,n-1这n个数字排成一个圆圈,从数字0开始,每次从这个圆圈里删除第m个数字。求出这个圆圈里剩下的最后一个数字。
例如,0、1、2、3、4这5个数字组成一个圆圈,从数字0开始每次删除第3个数字,则删除的前4个数字依次是2、0、4、1,因此最后剩下的数字是3。
image.png
解题思路1(暴力解):
- 例如a=[0,1,2,3,4],n=5,m=3,第一次删除数字为2,因为从0开始,所以删除数字2=(m-1)%len(a),此时n=len(a);
- 第二轮删除,需将删除元素的前面的数据后移到列表末尾,删除元素前面有多少个数字呢,正好等于删除元素的值,此时等于2;那么第二轮删除元素即(i+m-1)%len(a),此时的len(a)=4;
- 因此迭代判断条件即a的长度大于1,删除元素即i = (上一轮i+m-1)%len(a);
- 不断a.pop(i),直到剩余1个数,该方法耗时较长。
Python3代码:
class Solution:
def lastRemaining(self, n: int, m: int) -> int:
i, a = 0, list(range(n))
while len(a) > 1:
i = (i + m - 1) % len(a)
a.pop(i)
return a[0]