演算法題:第 77 題 - 爬樓梯
兩道演算法題:
1、寫一個樹的中序排序演算法。【這道題固定模式,沒啥好玩的,自己去熟悉就可以了,沒有下面例子題目有趣】
2、是 Leecode 的第 70. 爬樓梯面試題目:
假設你正在爬樓梯。需要 n 階你才能到達樓頂。
每次你可以爬 1 或 2 個臺階。你有多少種不同的方法可以爬到樓頂呢?
注意:給定 n 是一個正整數。
我的解題思路:
from itertools import permutations
def step_all(n):
total = 0
"""
:param n: 總檯階,每次只走1或2,組合有多少種
:return: all
"""
if n == 1:
return 1
elif n == 2:
return 2
elif n >= 3:
if n % 2 == 0:
step_min = int(n/2) # 最小的step登頂
for i in range(step_min+1, n):
len_i = i # 長度
count_two = (step_min - (len_i - step_min))
count_one = len_i - count_two
list_step = [2 for x in range(count_two)]
list_step.extend([1 for y in range(count_one)])
li_per = list(permutations(list_step))
count = len(set(li_per))
total += count
return total+2
elif n % 2 == 1:
total = 0
step_min = int((n-1) / 2) + 1 # 最小的step登頂,step-min為2的個數 3:2 4:1 5:0
for i in range(step_min+1, n):
len_i = i # 長度
count_two = (step_min - (len_i-(step_min-1)))
print(count_two)
count_one = len_i - count_two
list_step = [2 for x in range(count_two)]
list_step.extend([1 for y in range(count_one)])
li_per = list(permutations(list_step))
count = len(set(li_per))
print(count)
total += count
print(total)
step_min_list = [2 for z in range(step_min-1)]
step_min_list.extend([1 for i in range(1)])
li_per = list(permutations(step_min_list))
step_min_list_count = len(set(li_per))
total = total + step_min_list_count + 1
return total
上述的程式碼在 1-15 之間的執行是沒問題的,所以便提交到 Leecode,發現報錯。
然後便換一種方式了,原理不變,藉助數學組合公式並去重得出結果【核心是:對 [1,1,1,2,2,1,1] 類似的資料進行去重組合】
def step_all(n):
def mutil_sum(start_x, end_x=None):
sum_total = 1
if end_x:
print(end_x)
for i in range(start_x, start_x - end_x, -1):
sum_total *= i
return sum_total
for i in range(1, start_x + 1):
sum_total *= i
return sum_total
if n == 1:
return 1
elif n == 2:
return 2
elif n >= 3:
if n % 2 == 0:
total = 0
min_len = int((n / 2))
count_two = min_len
count_one = 0
for i in range(min_len, n):
print("只需%s次爬上樓頂"%(count_two + count_one))
print("2的個數:%s" % count_two)
print("1的個數:%s" % count_one)
if count_two >= count_one:
type_sum = mutil_sum((count_one+count_two), count_two) / mutil_sum(count_two)
total += type_sum
print("只需%s次爬上樓頂的組合數為:%s"%((count_two + count_one), type_sum))
else:
type_sum = mutil_sum((count_one + count_two), count_one) / mutil_sum(count_one)
total += type_sum
print("只需%s次爬上樓頂的組合數為:%s" % ((count_two + count_one), type_sum))
count_two -= 1
count_one += 2
print("只需%s次爬上樓頂" % (count_two + count_one))
print("2的個數:%s" % count_two)
print("1的個數:%s" % count_one)
if count_two >= count_one:
print("%s >= %s"%(count_two, count_one))
type_sum = (mutil_sum((count_one+count_two), count_two)) / mutil_sum(count_two)
total += type_sum
print("只需%s次爬上樓頂的組合數為:%s" % ((count_two + count_one), type_sum))
else:
type_sum = (mutil_sum((count_one+count_two), count_two)) / mutil_sum(count_one)
total += type_sum
print("只需%s次爬上樓頂的組合數為:%s" % ((count_two + count_one), type_sum))
return total
if n % 2 == 1:
total = 0
min_len = int(((n - 1) / 2)) + 1
count_two = min_len - 1
count_one = 1
for i in range(min_len, n):
print("只需%s次爬上樓頂"%(count_two + count_one))
print("2的個數:%s" % count_two)
print("1的個數:%s" % count_one)
if count_two >= count_one:
type_sum = (mutil_sum((count_one+count_two), count_two)) / mutil_sum(count_two)
total += type_sum
print("只需%s次爬上樓頂的組合數為:%s"%((count_two + count_one), type_sum))
else:
type_sum = (mutil_sum((count_one+count_two), count_one)) / mutil_sum(count_one)
total += type_sum
print("只需%s次爬上樓頂的組合數為:%s" % ((count_two + count_one), type_sum))
count_two -= 1
count_one += 2
print("只需%s次爬上樓頂" % (count_two + count_one))
print("2的個數:%s" % count_two)
print("1的個數:%s" % count_one)
if count_two >= count_one:
type_sum = (mutil_sum((count_one+count_two), count_two)) / mutil_sum(count_two)
total += type_sum
print("只需%s次爬上樓頂的組合數為:%s" % ((count_two + count_one), type_sum))
else:
type_sum = (mutil_sum((count_one+count_two), count_one)) / mutil_sum(count_one)
total += type_sum
print("只需%s次爬上樓頂的組合數為:%s" % ((count_two + count_one), type_sum))
return total
執行結果 OK,程式碼的執行效率底下,需要進行最佳化,目前只是能實現功能而已。可惜當時沒時間。沒去發現規律。不過我覺得這種更好玩,比那種直接寫二叉樹啥的固定模式好玩。用例子來描述演算法,這方式值得提倡。最近學習了動態規劃,利用動態規劃試下
相關文章
- LeetCode 70題 爬樓梯 -- JavaScriptLeetCodeJavaScript
- LeetCode每日一題:爬樓梯(No.70)LeetCode每日一題
- [演算法] 一、爬樓梯演算法
- 使用 JavaScript 解決經典爬樓梯問題JavaScript
- 我用演算法學golang(爬樓梯)演算法Golang
- 70. 爬樓梯
- leetcode 70 爬樓梯LeetCode
- [Python手撕]爬樓梯Python
- Python演算法:如何解決樓梯臺階問題Python演算法
- 刷題系列 - 計算爬樓梯不同步數的方法數
- 力扣---70. 爬樓梯力扣
- 讓我們一起啃演算法----爬樓梯演算法
- (39/60)DP基礎、斐波那契數、爬樓梯、用最小花費爬樓梯
- 2020-11-08(70. 爬樓梯)
- 746. 使用最小花費爬樓梯
- 程式碼隨想錄演算法訓練營第35天 | 動態規劃1:509.斐波那契數、70.爬樓梯、746.使用最小花費爬樓梯演算法動態規劃
- LCR 088. 使用最小花費爬樓梯
- [Python手撕]使用最小花費爬樓梯Python
- 746. 使用最小花費爬樓梯 ( dp )
- LeetCode-746 使用最小花費爬樓梯LeetCode
- 程式碼隨想錄day32 || 509 斐波那契數列,70 爬樓梯,746 最小代價爬樓梯
- 程式碼隨想錄演算法訓練營 | 動態規劃,509. 斐波那契數,70. 爬樓梯, 746. 使用最小花費爬樓梯演算法動態規劃
- 增補部落格 第十九篇 python 爬樓梯Python
- 程式碼隨想錄演算法訓練營第三十八天 | 746. 使用最小花費爬樓梯,、70. 爬樓梯,509. 斐波那契數演算法
- 每天爬5層樓梯,心臟疾病風險降20%!
- 2024.9.6 leetcode 70 爬樓梯 (雜湊表/動態規劃)LeetCode動態規劃
- 程式碼隨想錄演算法訓練營第三十二天|leetcode509. 斐波那契數、leetcode70. 爬樓梯、leetcode746. 使用最小花費爬樓梯演算法LeetCode
- 超級樓梯 hd 2041
- 面試官在“逗”你係列:到底應該怎麼爬樓梯?!面試
- hdu.2042 超級樓梯
- KMP演算法(Leetcode第28題)KMP演算法LeetCode
- 不管是青蛙跳臺階還是who爬樓梯,能上去就行
- JavaScript原生實現樓梯外掛JavaScript
- 領釦LintCode演算法問題答案-77. 最長公共子序列演算法
- 38天【程式碼隨想錄演算法訓練營34期】第九章 動態規劃part01 (● 理論基礎 ● 509. 斐波那契數 ● 70. 爬樓梯 ● 746. 使用最小花費爬樓梯)演算法動態規劃
- 第二章 :查詢與排序-------2.16 解題實戰_小白上樓梯(遞迴設計)排序遞迴
- 猿人學web端爬蟲攻防大賽賽題第6題——js 混淆 - 回溯Web爬蟲JS
- 猿人學web端爬蟲攻防大賽賽題第20題——2022新春快樂Web爬蟲