python買賣股票的最佳時機--貪心/蠻力算法簡介


開始刷leetcode算法題 今天做的是“買賣股票的最佳時機” 

題目要求 

     給定一個數組,它的第 i 個元素是一支給定股票第 i 天的價格。

     設計一個算法來計算你所能獲取的最大利潤。你可以盡可能地完成更多的交易(多次買賣一支股票)。

     注意:你不能同時參與多筆交易(你必須在再次購買前出售掉之前的股票)。

看到這個題目 最初的想法是蠻力法

  通過兩層循環 不斷計算不同天之間的利潤及利潤和 

下面上代碼

 1 class Solution(object):
 2     def maxProfit(self, prices):
 3         """
 4         :type prices: List[int]
 5         :rtype: int
 6         """
 7 
 8         self.allbuy1 = []    #單次買賣的差值數組 (可能為負)
 9         self.allbuy2 = []    #所有可能買賣的利潤數組 (可能為負)
10                              # allbuy1和allbuy2的區別為一個是單次買賣 一個是多次買賣和
11         self.curbuy(prices,0,0) #prices 為價格表 0:初始 0:
12         #print(self.allbuy1)
13         #print(self.allbuy2)
14         return  self.picBigest(self.allbuy2)
15     def buyticket(self,prilist,a,b):       #list:放入的價格數組 a:上一次買入的價格 b:今天賣出的價格
16         return  prilist[b] -prilist[a]   #返回 賺取得價格
17 
18     def curbuy(self,plist,x,result): #plist:價格數組 x:當天的數組坐標 result: 利潤
19         obj=result                     #固定上一次的價格 保存為上一個遞歸
20         lens=len(plist)                #天數
21         for i in range(x,lens-1):
22             for j in range(i+1,lens):
23                 temp=self.buyticket(plist,i, j)
24                 self.allbuy1.append(temp)
25                 self.allbuy2.append(temp)     #單次利潤放入數組
26                 result = obj + temp     #將之前的利潤加上今天的利潤
27                 if(x>=2):             #如果買入是第2+1天以后  則可以加上之前的利潤
28                     self.allbuy2.append(result)  #多次買賣利潤放入數組
29                 self.curbuy(plist,j+1,result)   #遞歸 j+1:賣出的后一天 result:利潤
30 
31     def picBigest(self,reslist):  
32         big=0
33         for i in reslist:
34             if (i>big):
35                 big=i
36         print(big)
37         return big
38 
39 if __name__ == '__main__':
40         test=Solution()
41         prices = [5,7,3,8]  # 輸入的每日股票數組
42         test.maxProfit(prices)

分析:

這個代碼理解起來簡單 就是將所有可能都放入數組中 找出最大一個可能  

將這個代碼提交時 顯示 超出時間限制 確實 如果輸入的數組長度非常大時 計算量巨大 出現錯誤

——————————————————————————————————————————————————————————————————————————————

更換思路:利用貪心算法解決此事

首先介紹 一下貪心算法: 對問題只對當前情況進行最優解處理,之后發生什么對之前的決定都不改變。簡單的說就是一個局部最優解的過程

介紹個例子就明白了:  找零錢問題

假設有面值為5元、2元、1元、5角、2角、1角的貨幣,需要找給顧客4元6角現金,為使付出的貨幣的數量最少

  首先找出小於4元6角的最大面值(2元)

  其次找出小於2元6角的最大面值(2元)

  接着找出小於6角的最大面值(5角)

  最后找出小於1角的最大面值(1角) ---付出4張紙幣

介紹完了貪心算法簡單思想 就利用該方法解決對應問題

在已知股票價格走勢情況下 只需要對下一天進行判斷 如果漲了 則買 如果跌了則賣 這樣收益會保持固定增長

當然了 有人會提出 我可以選擇不賣等幾天再賣 或不買等幾天再買 的方式 一樣可以保持增長 但是如圖

如果在第2天買入 3天賣出 4天買入 5天賣出 收益為A+B

如果在第2天買入 5天賣出 收益為 C                                         

明顯得出A+B大於C          所以貪心法在這種情況非常適用並且肯定得到最優解

直接上代碼

 1 class Solution(object):
 2     def maxProfit(self, prices):
 3         profit = 0
 4         for day in range(len(prices)-1):
 5             differ = prices[day+1] - prices[day]
 6             if differ > 0:
 7                 profit += differ
 8         return profit
 9 if __name__ == '__main__':
10         test=Solution()
11         prices = [5,7,3,9]  # 輸入的每日股票數組
12         print(test.maxProfit(prices))

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM