方法一:暴力搜索(dfs)
对于每天的股价,有三种情况,不买不卖,买,卖;对于这三种情况进行深度优先搜索
class Solution {
private:int len,maxprofit=0;
public:
int maxProfit(vector<int>& prices) {
len=prices.size();
if(len<2) return 0;
dfs(prices,0,0,maxprofit);
return maxprofit;
}
void dfs(vector<int>prices,int index,int status,int profit){
if(index==len){
maxprofit=max(maxprofit,profit);
return;
}
dfs(prices,index+1,status,profit);//不卖不卖
if(status) dfs(prices,index+1,1,profit-prices[index]);//买
else dfs(prices,index+1,0,profit+prices[index]);//卖
}
};
方法二:贪心算法
后一天股价-前一天股价有三种可能,盈利,亏损,利润不变,由贪心思想可知,我们需要每次都盈利
class Solution {
public:
int maxProfit(vector<int>& prices) {
int maxprofit=0;
if(prices.empty()) return 0;//空数据特判
for(int i=0;i<prices.size()-1;i++)
if(prices[i+1]>prices[i])//只盈利
maxprofit+=prices[i+1]-prices[i];
return maxprofit;
}
};
方法三:波峰波谷法(简单模拟)
每次在波谷买入,波峰卖出获得最大利润
class Solution {
public:
int maxProfit(vector<int>& prices) {
int i=0,maxprofit=0;
if(prices.empty()) return 0;
int peak=prices[0],valley=prices[0];
while(i<prices.size()-1){
while(i<prices.size()-1&&prices[i]>=prices[i+1])//下标移动到波谷
i++;
valley=prices[i];
while(i<prices.size()-1&&prices[i]<=prices[i+1])//下标移动到波峰
i++;
peak=prices[i];
maxprofit+=peak-valley;
}
return maxprofit;
}
};