390. 消除游戏
难度中等163 收藏 分享 切换为英文 接收动态 反馈
列表 arr
由在范围 [1, n]
中的所有整数组成,并按严格递增排序。请你对 arr
应用下述算法:
- 从左到右,删除第一个数字,然后每隔一个数字删除一个,直到到达列表末尾。
- 重复上面的步骤,但这次是从右到左。也就是,删除最右侧的数字,然后剩下的数字每隔一个删除一个。
- 不断重复这两步,从左到右和从右到左交替进行,直到只剩下一个数字。
给你整数 n
,返回 arr
最后剩下的数字。
题解
错误的题解(超时了)
【看了别人的题解,他们都没有直接构造这个数组,而是从侧面计算数组的规律,节省了大量的时间和空间】
class Solution:
def left(self, arr):
return [j for i,j in enumerate(arr) if i % 2 == 1]
def right(self, arr):
if len(arr) % 2 == 0:
return [j for i,j in enumerate(arr) if i % 2 == 0]
else:
return [j for i,j in enumerate(arr) if i % 2 == 1]
def lastRemaining(self, n: int) -> int:
arr = list(range(1, n + 1))
while len(arr) != 1:
# print('b l:', arr)
arr = self.left(arr)
if len(arr) == 1:
return arr[0]
# print('b r:', arr)
arr = self.right(arr)
if len(arr) == 1:
return arr[0]
return arr[0]
官方题解
消除游戏 - 消除游戏 - 力扣(LeetCode) (leetcode-cn.com)
class Solution:
def lastRemaining(self, n: int) -> int:
a1 = 1
k, cnt, step = 0, n, 1
while cnt > 1:
if k % 2 == 0: # 正向
a1 += step
else: # 反向
if cnt % 2:
a1 += step
k += 1
cnt >>= 1
step <<= 1
return a1
作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/elimination-game/solution/xiao-chu-you-xi-by-leetcode-solution-ydpb/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
约瑟夫环方法
【宫水三叶】约瑟夫环运用题 - 消除游戏 - 力扣(LeetCode) (leetcode-cn.com)