方法一: 利用滑动窗的方法
class Solution {
public:
int maxProfit(vector<int>& prices) {
int max = 0;
int size = prices.size();
if(size <= 1) return max;
int left = 0, right = 1;
while(left < right && right < size)
{
if(right - left == 1 && prices[right] <= prices[left])//针对7 1 2 4 6
{
left = right;
right++;
}
else if(prices[right] > prices[left])
{
max = (prices[right] - prices[left] > max)? (prices[right] - prices[left]):max;
right++;
}
else // 针对2 4 5 1 8 9
{
left = right;
right++;
}
}
return max;
}
};
优化:发现针对7 1 2 4 6和 2 4 5 1 8 9的处理是一样的
class Solution {
public:
int maxProfit(vector<int>& prices) {
int max = 0;
int size = prices.size();
if(size <= 1) return max;
int left = 0, right = 1;
while(left < right && right < size)
{
if(prices[right] > prices[left])
{
max = (prices[right] - prices[left] > max)? (prices[right] - prices[left]):max;
right++;
}
else
{
left = right;
right++;
}
}
return max;
}
};
方法二:利用动态规划
class Solution {
public:
int maxProfit(vector<int>& prices) {
int size = prices.size();
if(size <= 1) return 0;
vector<int> dp(size, 0);
dp[0] = 0;
int min = prices[0];
for(int i = 1; i < size; i++)
{
min = (min < prices[i])? min: prices[i];
dp[i] = max(dp[i-1], prices[i] - min);//状态转移方程
}
return dp[size - 1];
}
};
进一步优化,去掉数组dp
class Solution {
public:
int maxProfit(vector<int>& prices) {
int res = 0;
int size = prices.size();
if(size <= 1) return res;
int min = prices[0];
for(int i = 1; i < size; i++)
{
min = (min < prices[i])? min: prices[i];
res = max(res, prices[i] - min);//状态转移方程
}
return res;
}
};