本文目錄一覽:
python算法編程題,求代碼
這道題的核心在於設計算法:
根據描述:這道題的編程思路應該是這樣的:任意三個數的和除以2=剩餘三個數中的任意兩數的平均值=遊戲機的價格。
可以這樣做,把六個數放入數組中,做一個多層嵌套循環遍歷所有組合,當滿足上述條件時執行一個返回結果的動作,可能有不止一個答案。
Python 算法 2022-06-23
描述:一群孩子做遊戲,現在請你根據遊戲得分來發糖果,要求如下:
給定一個數組 arrarr 代表得分數組,請返回最少需要多少糖果
描述:有 n 個活動即將舉辦,每個活動都有開始時間與活動的結束時間,第 i 個活動的開始時間是 starti ,第 i 個活動的結束時間是 endi ,舉辦某個活動就需要為該活動準備一個活動主持人。
一位活動主持人在同一時間只能參與一個活動。並且活動主持人需要全程參與活動,換句話說,一個主持人參與了第 i 個活動,那麼該主持人在 (starti,endi) 這個時間段不能參與其他任何活動。求為了成功舉辦這 n 個活動,最少需要多少名主持人。
輸入:
2,[[1,2],[2,3]]
返回值:
1
說明:
只需要一個主持人就能成功舉辦這兩個活動
輸入:
2,[[1,3],[2,4]]
返回值:
2
說明:
需要兩個主持人才能成功舉辦這兩個活動
描述:假設你有一個數組prices,長度為n,其中prices[i]是股票在第i天的價格,請根據這個價格數組,返回買賣股票能獲得的最大收益
1.你可以買入一次股票和賣出一次股票,並非每天都可以買入或賣出一次,總共只能買入和賣出一次,且買入必須在賣出的前面的某一天
2.如果不能獲取到任何利潤,請返回0
3.假設買入賣出均無手續費
數據範圍: 0 = n = 10^5 , 0 = val = 10^4
要求:空間複雜度 O(1),時間複雜度 O(n)
描述:假設你有一個數組prices,長度為n,其中prices[i]是某隻股票在第i天的價格,請根據這個價格數組,返回買賣股票能獲得的最大收益
描述:描述
假設你有一個數組prices,長度為n,其中prices[i]是某隻股票在第i天的價格,請根據這個價格數組,返回買賣股票能獲得的最大收益
這裡的buy2以及profit2如何更新?
1.只有一個數出現奇數次,其它數出現偶數次
2.共有兩個數出現奇數次,其它數目出現偶數次
#一個數與自己的取反加1就是得到該數最右位置的1
eor(~eor+1)
Python 算法
什麼是算法
“算法(Algorithm)是指解題方案的準確而完整的描述,是一系列解決問題的清晰指令,算法代表着用系統的方法描述解決問題的策略機制。”
“在談到算法時,我們不得不去了解一下什麼是時間複雜度和空間複雜度這兩個概念”
計算機科學中,算法的時間複雜度是一個函數,它定量描述了該算法的運行時間,時間複雜度常用大O符號(大O符號(Big O notation)是用於描述函數漸進行為的數學符號。
空間複雜度:它是用來評估算法內存佔用大小的一個式子。
Python 算法的幾大重要特徵
Python算法除了具有以上特徵,還和時間和空間有關係,不同的算法可能用不同的時間、空間或效率來完成同樣的任務,因此, 一個Python算法的優劣可以用空間複雜度與時間複雜度來衡量。
通過實例加深對算法的理解
如題所示:
要求x,y,z的1000以內取值滿足x x+y y=z*z,同時x+y+z=1000,求解出所以x,y,z的組合情況?
求解過程如下
這裡使用了一個waste_time方法作為裝飾器來計算裝飾過的方法的執行時間,這裡有兩種算法來求解這個問題
代碼如下:
總結:
通過這個示例,對於同一個問題給出兩種不同的算法,兩種算法在執行過程中我增加了對程序執行時間的統計,通過時間上的對比發現兩個算法的執行時間相差非常的大,如響應結果所示。
由此我們可以得出一個結論,就是實現不同的算法程序執行的時間可以反應出算法的效率,即算法有優劣之分,好的算法可以節約時間,提高效率,反之則不然。
Python之動態規划算法
動態規划算法中是將複雜問題遞歸分解為子問題,通過解決這些子問題來解決複雜問題。與遞歸算法相比,動態編程減少了堆棧的使用,避免了重複的計算,效率得到顯著提升。
先來看一個簡單的例子,斐波那契數列.
斐波那契數列的定義如下。
斐波那契數列可以很容易地用遞歸算法實現:
上述代碼,隨着n的增加,計算量呈指數級增長,算法的時間複雜度是 。
採用動態規划算法,通過自下而上的計算數列的值,可以使算法複雜度減小到 ,代碼如下。
下面我們再看一個複雜一些的例子。
這是小學奧數常見的硬幣問題: 已知有1分,2分,5分三種硬幣數量不限,用這些硬幣湊成為n分錢,那麼一共有多少種組合方法。
我們將硬幣的種類用列表 coins 定義;
將問題定義為一個二維數組 dp,dp[amt][j] 是使用 coins 中前 j+1 種硬幣( coins[0:j+1] )湊成總價amt的組合數。
例如: coins = [1,2,5]
dp[5][1] 就是使用前兩種硬幣 [1,2] 湊成總和為5的組合數。
對於所有的 dp[0][j] 來說,湊成總價為0的情況只有一種,就是所有的硬幣數量都為0。所以對於在有效範圍內任意的j,都有 dp[0][j] 為1。
對於 dp[amt][j] 的計算,也就是使用 coins[0:j+1] 硬幣總價amt的組合數,包含兩種情況計算:
1.當使用第j個硬幣時,有 dp[amt-coins[j]][j] 種情況,即amt減去第j個硬幣幣值,使用前j+1種硬幣的組合數;
2.當不使用第j個硬幣時,有 dp[amt][j-1] 種情況,即使用前j種硬幣湊成amt的組合數;
所以: dp[amt][j] = dp[amt – coins[j]][j]+dp[amt][j-1]
我們最終得到的結果是:dp[amount][-1]
上述分析省略了一些邊界情況。
有了上述的分析,代碼實現就比較簡單了。
動態規划算法代碼簡潔,執行效率高。但是與遞歸算法相比,需要仔細考慮如何分解問題,動態規劃代碼與遞歸調用相比,較難理解。
我把遞歸算法實現的代碼也附在下面。有興趣的朋友可以比較一下兩種算法的時間複雜度有多大差別。
上述代碼在Python 3.7運行通過。
求Python大神解答
最後的輸出語句已經限定了函數名是gcd
函數里的算法是求最大公約數的輾轉相除法。輾轉相除法是一個循環處理過程,所以第二個是while
同理,最後return的應該是n
def gcd(m,n):
r=m%n
while r:
m=n
n=r
r=m%n
else:
return n
原創文章,作者:UHOLA,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/317382.html