剑指 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(暴力解):

  1. 例如a=[0,1,2,3,4],n=5,m=3,第一次删除数字为2,因为从0开始,所以删除数字2=(m-1)%len(a),此时n=len(a);
  2. 第二轮删除,需将删除元素的前面的数据后移到列表末尾,删除元素前面有多少个数字呢,正好等于删除元素的值,此时等于2;那么第二轮删除元素即(i+m-1)%len(a),此时的len(a)=4;
  3. 因此迭代判断条件即a的长度大于1,删除元素即i = (上一轮i+m-1)%len(a);
  4. 不断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]
上一篇下一篇

猜你喜欢

热点阅读