给定一个数组 M ,它的第i个元素 M[i] 表示一支给定股票第i天的价格,第i天买了之后,第i+N(N>1的整数)的任何一都天可买掉,
设算法来获取所能获取的最大利润。
函数返回可以从这笔交易中获取的最大利润。
如果不能获取任何利润,则返回0。
示例 1:
输入:[5, 6, 1, 3, 6, 5 ,5, 1, 7]
输出:6
示例 1:
输入:[7, 1, 5, 3, 6, 4 ,5, 6, 2]
输出:5
源码:
// Len_maxProfit.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#include <iostream>
#include <vector>
#include <cmath>
using namespace std;
#define Max(a,b) ((a) > (b) ? (a) : (b))
int MaxProfit(vector<int>& prices)
{
int maxFit = 0;
int left = 0;
int right = 1;
if (prices.size() <= 1)
{
return maxFit;
}
while (right < prices.size())
{
// 当右值比左值小的时候,更新佐值位置
if (prices[left] >= prices[right])
{
left = right;
}
else
{
// 每次右值走一步的时候,说明右值比左值大,和上一轮的最大值左比较取最大值
int tempFit = prices[right] - prices[left];
maxFit = Max(maxFit, tempFit);
}
right++;
}
return maxFit;
}
int main()
{
vector<int> M= { 5, 6, 1, 3, 6, 5 ,5, 2, 7 };
int fit = MaxProfit(M);
printf("\n\t1.fit=%d", fit);
M.clear();
M = { 7, 1, 5, 3, 6, 4 ,5, 6, 2};
fit = MaxProfit(M);
printf("\n\n\t2.fit=%d", fit);
return 1;
}
执行结果:
解题思路:
维护一个左值和右值,右值先行,再根据大小在右值范围内移动左值。