leetcode 面试题62. 圆圈中最后剩下的数字 python 剑指offer系列 5 约瑟夫环问题

题目描述

在这里插入图片描述

题解

解法一

嗯…我是先找的数学规律,模拟整个过程,找到每次要删除的点的索引。
规律就是:这一次要删除的索引 = (上一次索引+m-1)% len(num)
num 是存储剩下的数的列表。

class Solution:
    def lastRemaining(self, n: int, m: int) -> int:
        num = [i for i in range(n)]
        index = 0
        while len(num) > 1:
            index = (index+m-1)%len(num)
            num.pop(index)
        return num[0]

但是这个方法很慢…虽然勉强没超时…删除操作很耗时,因为要把后面的数移上来。

解法二:从最后倒推回剩下的数在列表中的索引

也是一种数学解法,不过这种解法不需要删除操作,节省了很多时间
甜姐的题解
甜姐太厉害了!!!

解法三:循环链表,这个也会超时

看看代码咋写的就行,这里附上一个别人写的代码:
作者 @一台小钢炮

class node:
    def __init__(self, val):
        self.val = val
        self.next = None
class Solution:
    def lastRemaining(self, n: int, m: int) -> int:
        if m == 1:
            return n - 1 
        head = node(0)
        p = head
        for i in range(1, n):
            newnode = node(i)
            p.next = newnode
            p = newnode
        p.next = head
        p = head

        while n >= 1:
            for _ in range(m - 2):
                p = p.next
            p.next = p.next.next
            p = p.next
            n -= 1
        return p.val
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值