leetcode 面试题62.
题目描述
题解
解法一
嗯…我是先找的数学规律,模拟整个过程,找到每次要删除的点的索引。
规律就是:这一次要删除的索引 = (上一次索引+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