乙個有名的按摩師會收到源源不斷的預約請求,每個預約都可以選擇接或不接。在每次預約服務之間要有休息時間,因此她不能接受相鄰的預約。給定乙個預約請求序列,替按摩師找到最優的預約集合(總預約時間最長),返回總的分鐘數。
注意:本題相對原題稍作改動
示例 1:
輸入: [1,2,3,1]示例 2:輸出: 4
解釋: 選擇 1 號預約和 3 號預約,總時長 = 1 + 3 = 4。
輸入: [2,7,9,3,1]示例 3:輸出: 12
解釋: 選擇 1 號預約、 3 號預約和 5 號預約,總時長 = 2 + 9 + 1 = 12。
輸入: [2,1,4,5,3,1,1,3]思路:類似斐波那列的思想,即索引k取值結果等於k-1的結果 與 k-2加當前值的和 的最大值,即如下公式,使用遞迴實現:s(i輸出: 12
解釋: 選擇 1 號預約、 3 號預約、 5 號預約和 8 號預約,總時長 = 2 + 4 + 3 + 3 = 12。
)=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世紀義大利數學家斐波那契在他的 算盤書 中提出這樣乙個問題 有人想知道一年內一對兔子可繁殖成多少對,便築了一道圍牆把一對兔子關在裡面。已知一對兔子每乙個月可以生一對小兔子,而一對兔子出生後.第三個月開始生小兔子假如一年內沒有發生死亡,則一對兔子一年內能繁殖成多少對?這個問題衍生出了乙個...