Day19 圓圈中最後剩下的數字

2021-10-19 06:58:08 字數 1318 閱讀 9894

引入熱土豆問題:

熱土豆問題——「擊鼓傳花」的土豆版本

傳燙手的熱土豆,鼓聲停的時候,手裡有土豆的小孩要出列

解決思路

題目:

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...