2種解法 斐波那列馬甲問題

2021-10-04 08:40:19 字數 2250 閱讀 1755

乙個有名的按摩師會收到源源不斷的預約請求,每個預約都可以選擇接或不接。在每次預約服務之間要有休息時間,因此她不能接受相鄰的預約。給定乙個預約請求序列,替按摩師找到最優的預約集合(總預約時間最長),返回總的分鐘數。

注意:本題相對原題稍作改動

示例 1:

輸入: [1,2,3,1]

輸出: 4

解釋: 選擇 1 號預約和 3 號預約,總時長 = 1 + 3 = 4。

示例 2:

輸入: [2,7,9,3,1]

輸出: 12

解釋: 選擇 1 號預約、 3 號預約和 5 號預約,總時長 = 2 + 9 + 1 = 12。

示例 3:

輸入: [2,1,4,5,3,1,1,3]

輸出: 12

解釋: 選擇 1 號預約、 3 號預約、 5 號預約和 8 號預約,總時長 = 2 + 4 + 3 + 3 = 12。

思路:類似斐波那列的思想,即索引k取值結果等於k-1的結果 與 k-2加當前值的和 的最大值,即如下公式,使用遞迴實現:s(i

)=ma

x(s(

i−1)

,num

s[i]

+s(i

−2))

s(i) = max(s(i-1), nums[i] + s(i-2))

s(i)=m

ax(s

(i−1

),nu

ms[i

]+s(

i−2)

) 對於陣列長度為0的情況,進行特殊判斷

在遞迴中實現對應索引的求解

# author: [email protected]

class

solution

:def

fib(self,arr, n)

:if n ==1:

return arr[0]

elif n ==2:

return

max(arr[0]

,arr[1]

)# 遞迴公式

return

max(arr[n-1]

+ self.fib(arr,n-2)

, self.fib(arr,n-1)

)def

massage

(self, nums: list[

int])-

>

int:

numlen =

len(nums)

if numlen ==0:

return

0return self.fib(nums, numlen)

思路:原理還是斐波那列公式,使用動態規劃思想實現,使用迴圈代替遞迴,使用rst列表儲存每個索引位置的狀態結果,當然也可以不用列表,選擇三個變數來儲存臨時值,是的空間複雜度變為1.

特殊情況處理

使用rst儲存每個索引處的值,從前到後遞迴

返回結果的最後乙個值

# author: [email protected]

class

solution

:def

massage

(self, nums: list[

int])-

>

int:

numlen =

len(nums)

if numlen ==0:

return

0elif numlen ==1:

return nums[0]

# 這裡空間複雜度改為o(n)

rst =

[nums[0]

,max

(nums[0]

,nums[1]

)]for i in

range(2

,numlen)

:max

(rst[i-1]

,rst[i-2]

+ nums[i]))

return rst[-1

]# 下面將空間複雜度改為o(1)

#rst1, rst2 = nums[0],max(nums[0],nums[1])

#for i in range(2,numlen):

# rst1, rst2= rst2, max(rst2,rst1 + nums[i])

#return rst2

斐波那契數列解法

方法一 常規解法 def demo month 定義變數 a,b分別表示一月和二月的數目 a 0 a為第乙個數值 b 1 b為第二個數值 定義乙個計數器 i 0 while i month 列印每次的數值 print a a,b b,a b i 1 nume demo 3 方法二 函式的遞迴 def...

斐波那契數列解法

1 概念 在數學上,費波那契數列是以遞迴的方法來定義 f0 0 f1 1 fn fn 1 fn 2 n 2 用文字來說,就是費波那契數列由0和1開始,之後的費波那契係數就是由之前的兩數相加而得出。首幾個費波那契係數是 0,1,1,2,3,5,8,13,21,34,55,89,144,233 oeis...

兔子問題 斐波那契數的三種解法!

問題描述 13世紀義大利數學家斐波那契在他的 算盤書 中提出這樣乙個問題 有人想知道一年內一對兔子可繁殖成多少對,便築了一道圍牆把一對兔子關在裡面。已知一對兔子每乙個月可以生一對小兔子,而一對兔子出生後.第三個月開始生小兔子假如一年內沒有發生死亡,則一對兔子一年內能繁殖成多少對?這個問題衍生出了乙個...