1. 貪欲なアルゴリズム
1.1 貪欲アルゴリズムとナップザック問題の違い
貪欲アルゴリズムは局所最適性を通じて大域最適を導き出すことができますが、ナップザック問題は解決できないため、動的計画法によって解決する必要があります。
1.2 ルーチン
貪欲なアルゴリズムにはトリックはありません。!
重要なのは、この段階で局所最適解を得る方法と、局所最適解を介して大域最適解を得る方法を明確に考えることです。反例を提示できない場合は、それだけです。
2.リートコードに関する質問
2.1 質問 121 - 株を売買するのに最適な時期
配列 を指定すると prices
、その 番目の i
要素は 、prices[i]
指定された株式の th 日目の価格を表します i
。
将来、ある日に株を購入し 、 別の日に 株を売却することのみを選択できます 。得られる最大利益を計算するアルゴリズムを設計します。
この取引から得られる最大利益を返します。利益が得られない場合は返品してください 0
。
例 1:
入力: [7,1,5,3,6,4] 出力: 5 説明: 2 日目に買い (株価 = 1)、5 日目に売り (株価 = 6)、最大利益 = 6-1 = 5 。 販売価格が購入価格よりも高くなければならないため、利益は 7-1 = 6 にはならないことに注意してください。同時に、購入前に株式を売却することはできません。
class Solution(object):
def maxProfit(self, prices):
"""
:type prices: List[int]
:rtype: int
"""
# 贪心算法
# 局部最优解推出全局最优解
# 记录最大价格和最小价格的索引,记录局部最大利润
# 如果局部最大价格索引大于局部最小索引,更新索引,局部最大利润也更新
max_profit = 0
min_ind = -1
max_ind = -1
for i in range(1,len(prices)):
if prices[i] > prices[i-1]:
temp = prices[i]-prices[i-1]
if min_ind == -1:
min_ind = i-1
else:
if prices[i-1] < prices[min_ind]:
min_ind = i-1
if max_ind == -1:
max_ind = i
else:
if prices[i] >= prices[max_ind]:
max_ind = i
if max_profit < temp:
max_profit = temp
if max_profit < prices[i]-prices[min_ind]:
max_profit = prices[i]-prices[min_ind]
return max_profit