121—題目(只能買賣一次):
給定一個數組 prices ,它的第 i 個元素 prices[i] 表示一支給定股票第 i 天的價格。
你只能選擇 某一天 買入這只股票,并選擇在 未來的某一個不同的日子 賣出該股票。設計一個算法來計算你所能獲取的最大利潤。
返回你可以從這筆交易中獲取的最大利潤。如果你不能獲取任何利潤,返回 0 。
C++:
解法一、暴力解法(找最優間距)
class Solution
{
public:int maxProfit(vector<int>& prices){int result = 0;for(int i = 0; i<prices.size(); i++){for(int j = i+1; j<prices.size(); j++){result = max(result, prices[j]-prices[i]);}}return result;}
};
解法二:貪心算法
思路:
因為股票只買賣一次,那貪心的思路就是:
取最左最小值,取最右最大值,二者差值就是最大利潤。
class Solution
{
public:int maxProfit(vector<int>& prices){int low = INT_MAX;int result = 0;for(int i=0; i<prices.size();i++){low = min(low,prices[i]); // 取最左最小值// 如果prices[i]<low,result=0result = max(result, prices[i] - low); // 直接取最大區間利潤}return result;}
}
貪心法:
python:
class Solution:def maxProfit(self,prices):low = float("inf")result = 0for i in range(len(prices)):low = min(low, prices[i]) // 取最左最小價格result = max(result, prices[i] - low) // 直接取最大區間利潤return result
122—題目(買賣次數不限):
給你一個整數數組 prices ,其中 prices[i] 表示某支股票第 i 天的價格。
在每一天,你可以決定是否購買和/或出售股票。你在任何時候 最多 只能持有 一股 股票。你也可以先購買,然后在 同一天 出售。
返回 你能獲得的 最大 利潤 。
思路:
對于單獨交易日:
設今天價格 p1、明天價格 p2,則今天買入、明天賣出可賺取金額 p2?p1
?(負值代表虧損)。
對于連續上漲交易日: 設此上漲交易日股票價格分別為 p1,p2,…,pn,則第一天買最后一天賣收益最大,即 pn?p1;等價于每天都買賣,即 pn?p1=(p2?p1)+(p3?p2)+…+(pn?pn?1)。
對于連續下降交易日: 則不買賣收益最大,即不會虧錢。
整體流程:
遍歷整個股票交易日價格列表 price,并執行貪心策略:所有上漲交易日都買賣(賺到所有利潤),所有下降交易日都不買賣(永不虧錢)。
設 tmp 為第 i-1 日買入與第 i 日賣出賺取的利潤,即 tmp = prices[i] - prices[i - 1] ;
當該天利潤為正 tmp > 0,則將利潤加入總利潤 profit;當利潤為 000 或為負,則直接跳過;
遍歷完成后,返回總利潤 profit。
C++:
class Solution
{
public:int maxProfit(vector<int>& prices){int profit = 0;for(int i = 1; i<prices.size(); i++){int tmp = prices[i] - prices[i-1];if (tmp > 0){profit += tmp;}}return profit;}
};
python:
class Solution:def maxProfit(self,prices):profit = 0for i in range(1,len(prices)):tmp = prices[i] - prices[i-1]if tmp > 0:profit += tmpreturn profit