给定题目:
1.给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。
2.设计一个算法来计算你所能获取的最大利润。你可以尽可能地完成更多的交易(多次买卖一支股票)。
注意:你不能同时参与多笔交易(你必须在再次购买前出售掉之前的股票)。
示例 1:
输入: [7,1,5,3,6,4]
输出: 7
解释: 在第 2 天(股票价格 = 1)的时候买入,在第 3 天(股票价格 = 5)的时候卖出, 这笔交易所能获得利润 = 5-1 = 4 。随后,在第 4 天(股票价格 = 3)的时候买入,在第 5 天(股票价格 = 6)的时候卖出, 这笔交易所能获得利润 = 6-3 = 3 。
题目分析:
首先读完题目,我们应该分析题目的关键点。
1.什么时候买入,什么时候卖出。我们知道所获得利润公式是:卖出的价格-买入的价格。所以卖出的价格肯定要高于买入的价格。买入的价格我们当然希望越低越好
2.因为不可以同时进行交易,当一天买入,其后某天卖出才能再次买入。这里有一个容易忽略的点就是当天卖出后也可以当天买入(题目并没有说必须卖出的隔天才能再次买入),这一点对于简化代码非常重要。
举个例子,假定数组A=[1,3,5,6],如果限定不能同一天卖出和买入,则最大利润为6-1=5,多次交易的最大利润为3-1+6-5=3.这种情况下要得到最大利润,需要考虑很多变化,编程难度较大。但如果没有这个限制,我们可以根据一种规律的方式来得到最大利润,即第一天买入,发现第二天价格更高,可以进行一次卖出。得到利润为3-1=2.此时,第三天价格又高于第二天,则第二天卖出后再次买入,在第三天卖出,得到利润为5-3=2.这样一直到结束,总共利润为(3-1)+(5-3)+(6-5)=6-1=5.这样一旦发现第二天比当天价格高。便当天买入,然后第二天卖出。这种情况只需要判断后面的价格是否大于前面的即可。当遇到第二天价格低于第一天的时候,我们当然想以更低的价格买入,于是自动到第二天买入,然后一直这样循环下去。
编程思路
经过分析我们知道买入和卖出的时间可以只通过相邻两天的价格来确定,这样只需要遍历价格数组每个元素,然后与后面的元素进行比较,并进行利润的累加即可。
Leetcode环境下测试代码如下:
class Solution {
public:
int maxProfit(vector<int>& prices) {
int lenth=prices.size();//记录数组长度
int Maxprofit=0; //记录最大利益
int j; //记录卖出的时间
for(int i=0;i<lenth-1;i++)
{
j = i+1;//j始终保存i后面的位置
if(prices[j]>prices[i])
{
Maxprofit+=prices[j]-prices[i];
}
}
return Maxprofit; //返回最大利润
}
};
VS环境下完整代码如下:
#include<iostream>
#include<vector>
using namespace std;
class Solution {
public:
int maxProfit(vector<int>& prices) {
int lenth=prices.size();//记录数组长度
int Maxprofit=0; //记录最大利益
int j; //记录卖出的时间
for(int i=0;i<lenth-1;i++)
{
j = i+1;//j始终保存i后面的位置
if(prices[j]>prices[i])
{
Maxprofit+=prices[j]-prices[i];
}
}
return Maxprofit; //返回最大利润
}
};
int main()
{
vector<int> pricesMatrix={ 7,1,5,3,6,4};
Solution object;
cout<<object.maxProfit(pricesMatrix)<<endl;
}
来源:CSDN
作者:Inthesilence
链接:https://blog.csdn.net/Inthesilence/article/details/104756693