引入熱土豆問題:
熱土豆問題——「擊鼓傳花」的土豆版本
傳燙手的熱土豆,鼓聲停的時候,手裡有土豆的小孩要出列
解決思路:
題目:
0,1,···,n-1這n個數字排成乙個圓圈,從數字0開始,每次從這個圓圈裡刪除第m個數字(刪除後從下乙個數字開始計數)。求出這個圓圈裡剩下的最後乙個數字。
例如,0、1、2、3、4這5個數字組成乙個圓圈,從數字0開始每次刪除第3個數字,則刪除的前4個數字依次是2、0、4、1,因此最後剩下的數字是3。
leetcode原題鏈結
分析:
可以看出,這題是熱土豆問題的變式,帶入熱土豆問題的解決思路,模擬這個過程,**如下
from collections import deque
class
solution
:def
lastremaining
(self, n:
int, m:
int)
->
int:
record=deque(
)for i in
range
(n):
#這三行優化為:record=deque(range(n))
while
len(record)
>1:
for i in
range
(m-1):
))record.popleft(
)return record.pop(
)
但leetcode提交時,會超時:
最後採用題解的思路,成功通過
class
solution
:def
lastremaining
(self, n:
int, m:
int)
->
int:
i=0 record=
list
(range
(n))
while
len(record)
>1:
i=(i+m-1)
%len
(record)
record.pop(i)
return record[
0]
45 圓圈中最後剩下的數字
面試題45 圓圈中最後剩下的數字 每年六一兒童節,牛客都會準備一些小禮物去看望孤兒院的小朋友,今年亦是如此。hf作為牛客的資深元老,自然也準備了一些小遊戲。其中,有個遊戲是這樣的 首先,讓小朋友們圍成乙個大圈。然後,他隨機指定乙個數m,讓編號為0的小朋友開始報數。每次喊到m 1的那個小朋友要出列唱首...
劍指62 圓圈中最後剩下的數字
題目 0 n 1的n個數排成乙個圓圈,從0開始每次從這個圓圈刪除第m個數字,然後從刪除的數字的下乙個數字開始繼續直到剩最後1個數字位置。方法1 用list模擬圓圈 的環形鍊錶 每次迴圈到end 時都手動更新到begin 效率不高 stl list使用 class solution cur circl...
劍指 62 圓圈中最後剩下的數字
題目描述 0,1,n 1這n個數字排成乙個圓圈,從數字0開始每次從這個圓圈裡刪除第m個數字。求出這個圓圈裡剩下的最後乙個數字。演算法分析 方法一 使用鍊錶來模擬圓圈,時間複雜度為o mn 空間複雜度o n 方法二 約瑟夫環問題的數學公式法求解,公式推導見約瑟夫環問題 最簡單的數學解法 得到公式f n...